LINQ: Техника подкачки, использующая take и skip, но также необходимо общее количество записей - как это реализовать? - PullRequest
4 голосов
/ 25 ноября 2010

Я реализовал подпрограмму подкачки, используя skip and take.Это прекрасно работает, но мне нужно общее количество записей в таблице до вызова Take и Skip.

Я знаю, что могу отправить 2 отдельных запроса.

  1. Get Count
  2. Пропустить и взять

Но я бы предпочел не делать 2 звонка в LINQ.

Как мневернуть его в том же запросе (например, используя вложенный оператор select)?

Ранее я использовал технику подкачки в хранимой процедуре.Я возвратил элементы, используя временную таблицу, и передал счетчик выходному параметру.

Ответы [ 2 ]

8 голосов
/ 25 ноября 2010

Извините, но вы не можете.По крайней мере, не очень красиво.

Вы можете сделать это неуместно, но я не думаю, что вам это нравится:

var query = from e in db.Entities where etc etc etc;

var pagedQuery = 
    from e in query.Skip(pageSize * pageNumber).Take(pageSize)
    select new
    {
        Count = query.Count(),
        Entity = e
    };

Видите?Совсем не красиво.

0 голосов
/ 10 февраля 2011

Нет причин делать два отдельных запроса или даже хранимую процедуру.Используйте привязку let, чтобы отметить подзапрос, когда вы закончите, у вас может быть тип anon, который содержит как выбранный вами элемент, так и общее количество.Один запрос к базе данных, 1 выражение linq и все готово.Чтобы получить значения, это будет jobQuery.Select (x => x.item) или jobQuery.FirstOrDefault (). Count

Пусть выражения - это удивительная вещь.

...