Когда я выполняю запрос в Dapper и хочу только получить блок записей, могу ли я использовать .Skip (). Take (), или мне нужно использовать select top n * в SQL?
например, для таблицы с 10 000 записей, и я хочу только первую 200, потому что моя страница списка показывает только 200 страниц. Я запускаю это?
conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size);
Или это:
conn.Query<Widget>("select top 200 * from Widgets");
Является ли метод Dapper's .Query<T>
отложенным или нет?
Вы должны использовать SELECT TOP n...
Метод Query<T>
имеет необязательный параметр bool buffered = true
, который, когда true проходит полный набор результатов, считывает каждую строку в List<T>
. Вы можете сделать этот параметр false, и полученный IEnumerable<T>
будет «отложен» в том смысле, что запрос db не будет выполнен до тех пор, пока вы его не используете, а строки будут извлекаться со стороны db «по одному за раз» "(вызывает IDataReader.Read
на каждой итерации).
Итак, да, это может быть «отсрочено». ОДНАКО, вы все равно должны использовать TOP n
потому что в противном случае вы все равно выполнили бы и подготовили набор результатов для 10000 записей на стороне db, хотя вы можете перенести только первые n строк из них на клиента.