Lor*_*ori 12 c# sql linq linq-to-objects linq-to-sql
我需要通过降序发布日期来订购存储在数据库中的文章,然后在文章后面的前20条记录Id == 100.
这就是我想对Linq做的事情:
IQueryable<Article> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.SkipWhile(a => a.Id != 100)
.Take(20);
Run Code Online (Sandbox Code Playgroud)
但是,这会生成NotSupportedException,因为SkipWhileLinq to Sql不支持(请参阅此处).
一种可能的解决方案是执行查询,然后SkipWhile使用Linq应用于Object:
IEnumerable<ArticleDescriptor> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.ToList()
.SkipWhile(a => a.Article.Id != 100)
.Take(20);
Run Code Online (Sandbox Code Playgroud)
但这意味着我需要首先将整个有序列表加载到内存中,然后在一个文件后加载20篇文章Id == 100.
有没有办法避免这种巨大的内存消耗?
更一般地说,在SQL中实现这一目标的最佳方法是什么?
如果,正如我从列名称猜测的PublicationDate那样,不会更改,您可以在两个单独的查询中执行此操作:
PublicationDate的Article与Id == 100就像是:
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);
Run Code Online (Sandbox Code Playgroud)
甚至可能是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);
Run Code Online (Sandbox Code Playgroud)
但这可能太复杂了.试试看吧.
| 归档时间: |
|
| 查看次数: |
2669 次 |
| 最近记录: |