Постраничные результаты поиска с LINQ to SQL - PullRequest
21 голосов
/ 27 апреля 2009

Каков наилучший шаблон для разбивки на страницы с помощью LINQ to SQL ?

У меня есть следующий сценарий:

Предположим, я хочу найти предметов в таблице по описание . Я легко могу сделать:

public IQueryable<Item> FindItemsByDescription(string description)
{
   return from item in _dc.Items
          where item.Description.Contains(description);
}

Теперь, как лучше всего разбить на страницы этот набор результатов?

  1. Должен ли я выполнить запрос count , прежде чем делать это, чтобы узнать размер набора результатов, а затем ограничить этот запрос в соответствии с тем, что я хочу? Я чувствую, что это путь.
  2. Должен ли я выполнить полный запрос, взять счетчик из размера массива и вернуть из этого массива только разбитое на страницы подмножество? Я чувствую, что это будет огромной тратой времени, если набор результатов будет достаточно большим ... Или LINQ to SQL делает здесь какое-то волшебство?

Существует ли LINQ to SQL общий шаблон для выполнения этой операции?

РЕДАКТИРОВАТЬ: Я должен уточнить одну маленькую вещь. Я знаю методы Take и Skip. Но, прежде чем использовать Take и Skip , как мне получить общее количество результатов, которые запрос получит?

Ответы [ 2 ]

30 голосов
/ 27 апреля 2009

Шаблон для подкачки очень прост. Он включает использование методов расширения Skip () и Take () следующим образом:

public IQueryable<Item> FindItemsByDescription(string description, int pageIndex, int pageSize)
{
   return from item in _dc.Items
          where item.Description.
          Contains(description).
          Skip((pageIndex - 1) * pageSize).
          Take(pageSize);
}

ОБНОВЛЕНИЕ: Чтобы получить общее количество, просто используйте метод Count ():

int totalCount = from item in _dc.Items
                 where item.Description.
                 Contains(description).Count();

int numberOfPages = (int)(totalCount/pageSize);

В зависимости от того, как вы собираетесь отображать записи, вы можете использовать numberOfPages для отображения панели навигации с «Страница X из Y» ... Страница 1 из 10 и т. Д.

2 голосов
/ 27 апреля 2009

Вы можете использовать метод расширения Take:

public IQueryable<Item> FindItemsByDescription(string description, int resultAmount)
{
   return from item in _dc.Items
          where item.Description.Contains(description).Take(resultAmount);
}

Вы можете сделать еще один шаг и использовать Пропустить для последующих «страниц»:

public IQueryable<Item> FindItemsByDescription(string description, int resultAmount, int page)
{
   return from item in _dc.Items
          where item.Description.Contains(description).Skip(resultAmount * page).Take(resultAmount);
}
...