Как Вы реализовали бы подкачку страниц в запросе LINQ? На самом деле в настоящее время я был бы удовлетворен, можно ли sql функции TOP было подражать. Однако я уверен, что потребность в полной поддержке подкачки страниц подходит раньше позже так или иначе.
var queryResult = from o in objects
where ...
select new
{
A = o.a,
B = o.b
}
????????? TOP 10????????
Вы ищете методы расширения Skip
и Take
. Skip
перемещает первые N элементов в результате, возвращая остаток; Take
возвращает первые N элементов в результате, отбрасывая все оставшиеся элементы.
Дополнительную информацию об использовании этих методов см. в MSDN: http://msdn.microsoft.com/en-us/library/bb386988.aspx
Например:
int numberOfObjectsPerPage = 10;
var queryResultPage = queryResult
.Skip(numberOfObjectsPerPage * pageNumber)
.Take(numberOfObjectsPerPage);
Использование Skip
и Take
- определенно правильный путь. Если бы я реализовывал это, я бы, вероятно, написал свой собственный метод расширения для обработки пейджинга (чтобы сделать код более читабельным). Реализация, конечно, может использовать Skip
и Take
:
static class PagingUtils {
public static IEnumerable<T> Page<T>(this IEnumerable<T> en, int pageSize, int page) {
return en.Skip(page * pageSize).Take(pageSize);
}
public static IQueryable<T> Page<T>(this IQueryable<T> en, int pageSize, int page) {
return en.Skip(page * pageSize).Take(pageSize);
}
}
Класс определяет два метода расширения - один для IEnumerable
и один для IQueryable
, что означает, что вы можете использовать его как с LINQ to Objects, так и с LINQ to SQL (при написании запроса к базе данных компилятор выберет версию IQueryable
).
В зависимости от ваших требований к пейджингу, вы также можете добавить некоторое дополнительное поведение (например, для обработки отрицательных значений pageSize
или page
). Вот пример использования этого метода расширения в запросе:
var q = (from p in products
where p.Show == true
select new { p.Name }).Page(10, pageIndex);
( for o in objects
where ...
select new
{
A=o.a,
B=o.b
})
.Skip((page-1)*pageSize)
.Take(pageSize)
РЕДАКТИРОВАТЬ - Пропуск (0) удален, поскольку в нем нет необходимости
var queryResult = (from o in objects where ...
select new
{
A = o.a,
B = o.b
}
).Take(10);