Подкачка страниц с LINQ для объектов

Как Вы реализовали бы подкачку страниц в запросе LINQ? На самом деле в настоящее время я был бы удовлетворен, можно ли sql функции TOP было подражать. Однако я уверен, что потребность в полной поддержке подкачки страниц подходит раньше позже так или иначе.

var queryResult = from o in objects
                  where ...
                  select new
                      {
                         A = o.a,
                         B = o.b
                      }
                   ????????? TOP 10????????
81
задан user256890 4 March 2010 в 15:24
поделиться

4 ответа

Вы ищете методы расширения 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);
208
ответ дан 24 November 2019 в 09:24
поделиться

Использование 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);
50
ответ дан 24 November 2019 в 09:24
поделиться
   ( for o in objects
    where ...
    select new
   {
     A=o.a,
     B=o.b
   })
.Skip((page-1)*pageSize)
.Take(pageSize)
8
ответ дан 24 November 2019 в 09:24
поделиться

РЕДАКТИРОВАТЬ - Пропуск (0) удален, поскольку в нем нет необходимости

var queryResult = (from o in objects where ...
                      select new
                      {
                          A = o.a,
                          B = o.b
                      }
                  ).Take(10);
5
ответ дан 24 November 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: