【发布时间】:2012-03-02 22:12:11
【问题描述】:
我需要将存储在数据库中的文章按发布日期降序排列,然后使用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 将 SkipWhile 应用于 Object:
IEnumerable<ArticleDescriptor> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.ToList()
.SkipWhile(a => a.Article.Id != 100)
.Take(20);
但这意味着我需要先将整个有序列表加载到内存中,然后在带有Id == 100 的文章之后取 20 篇文章。
有没有办法避免这种巨大的内存消耗?
更一般地说,在 SQL 中实现这一目标的最佳方法是什么?
【问题讨论】:
-
有趣的要求。
Id和PublicationDate之间有什么关系吗?你真的想做的是按日期订购它们,沿着那个列表直到你到达Id100,然后然后拿下接下来的20个? -
是的,这正是我想要的。
Id和PublicationDate之间没有关系。这个要求的原因是我需要获取在我只知道Id的指定文章之后发布的一定数量的文章。当然,如果我知道那篇文章的PublicationDate,那就容易多了。
标签: c# sql linq linq-to-sql linq-to-objects