gpt4 book ai didi

c# - 如何在不先将整个列表加载到内存的情况下使用 Linq to Sql 实现 SkipWhile?

转载 作者:可可西里 更新时间:2023-11-01 08:27:38 27 4
gpt4 key购买 nike

我需要按发布日期降序排列存储在数据库中的文章,然后使用 Id == 100 获取文章之后的前 20 条记录。

这就是我想用 Linq 做的事情:

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

但是,这会生成 NotSupportedException,因为 Linq to Sql 不支持 SkipWhile(请参阅 here)。

一个可能的解决方案是执行查询,然后使用 Linq to Object 应用 SkipWhile:

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

但这意味着我需要先将整个有序列表加载到内存中,然后在 Id == 100 的文章之后取 20 篇文章。

有没有办法避免这种巨大的内存消耗?

更一般地说,在 SQL 中实现此目的的最佳方法是什么?

最佳答案

如果正如我从列名中猜测的那样,PublicationDate 没有改变,您可以在两个单独的查询中执行此操作:

  • 使用 Id == 100
  • 建立 ArticlePublicationDate
  • 检索从该日期开始的 20 篇文章

类似于:

var thresholdDate = db.Articles.Single(a => a.Id == 100).PublicationDate;
var articles =
db.Articles
.Where(a => a.PublicationDate <= thresholdDate)
.OrderByDescending(a => a.PublicationDate)
.Take(20);

甚至可能 LINQ to SQL 可以翻译这个:

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

但这对它来说可能太复杂了。试试看。

关于c# - 如何在不先将整个列表加载到内存的情况下使用 Linq to Sql 实现 SkipWhile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9227828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com