Как реализовать SkipWhile с Linq to Sql без предварительной загрузки всего списка в память?

Мне нужно упорядочить статьи, хранящиеся в базе данных, по убыванию даты публикации, а затем взять первые 20 записей после статьи с Id = = 100 .

Это то, что я хотел бы сделать с Linq:

IQueryable
articles = db.Articles .OrderByDescending(a => a.PublicationDate) .SkipWhile(a => a.Id != 100) .Take(20);

Однако это генерирует NotSupportedException, потому что SkipWhile не поддерживается в Linq to Sql (см. здесь ).

Возможное решение - выполнить запрос, а затем применить SkipWhile с помощью Linq to Object:

IEnumerable articles = 
    db.Articles
    .OrderByDescending(a => a.PublicationDate)
    .ToList()
    .SkipWhile(a => a.Article.Id != 100)
    .Take(20);

Но это означает, что мне нужно сначала загрузить весь упорядоченный список в память, а затем взять 20 статей после один с Id == 100 .

Есть ли способ избежать такого огромного потребления памяти?

В общем, как лучше всего добиться этого в SQL?

12
задан Lorenzo Polidori 10 February 2012 в 15:52
поделиться