c# - 遅い - リスト全体をメモリにロードせずにLinqでSqlにSkipWhileを実装するには?



linq take (2)

私は、出版日を降順にデータベースに格納された記事を注文し、 Id == 100記事の後に最初の20レコードを取ります。

これは私がLinqとしたいことです:

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

ただし、これは、 SkipWhileがLinq to Sqlでサポートされていないため、NotSupportedExceptionを生成しますここを参照)。

可能な解決策は、クエリを実行し、オブジェクトにLinqを使用してSkipWhileを適用することです。

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

しかし、これは、私が最初にメモリに順序リスト全体をロードし、 Id == 100ものの後に20の記事を取る必要があることを意味します。

この巨大なメモリ消費を避ける方法はありますか?

一般的に、SQLでこれを達成する最良の方法は何ですか?

https://src-bin.com


Answer #1

Where文を追加するだけの解決策はありませんか?

IQueryable<Article> articles = db.Articles.Where(a => a.id != 100).OrderByDescending(a => a.PublicationDate).Take(20);

Answer #2

このように試すことができます

var articles = 
    db.Articles
    .Where(a => a.PublicationDate < db.Articles
                                    .Where(aa => aa.Id==100)
                                    .Select(aa => aa.PublicationDate)
                                    .SingleOrDefault())
    .OrderByDescending(a => a.PublicationDate)
    .Take(20);




linq-to-objects