Sql server 实体框架-SkipWhile
我有以下按描述日期排序的行:Sql server 实体框架-SkipWhile,sql-server,entity-framework,linq,Sql Server,Entity Framework,Linq,我有以下按描述日期排序的行: var query = this.DbContext.Items.OrderByDescending(g => g.UpdatedAt); 0 Dog 2016-03-08 9 Cat 2016-03-07 2 Elephant 2016-03-06 8 Apple 2016-03-05 3 Banana 2016-03-04 7 Juice 2016-03-03 4 Potato 2016-03-02
var query = this.DbContext.Items.OrderByDescending(g => g.UpdatedAt);
0 Dog 2016-03-08
9 Cat 2016-03-07
2 Elephant 2016-03-06
8 Apple 2016-03-05
3 Banana 2016-03-04
7 Juice 2016-03-03
4 Potato 2016-03-02
5 Cafee 2016-03-01
第一个查询返回有限(例如4)个有序元素:
var result = query.Take(4).ToList();
0 Dog 2016-03-08
9 Cat 2016-03-07
2 Elephant 2016-03-06
8 Apple 2016-03-05
下一个查询应返回从ID 3开始的有限(4)个有序元素:
var result = query.ToList()
.SkipWhile(g => g.Id != startFrom.Value)
.Take(limit));
3 Banana 2016-03-04
7 Juice 2016-03-03
4 Potato 2016-03-02
5 Cafee 2016-03-01
问题在于性能,因为EF不支持SkipWhile
,所以我必须首先获取所有数据
当然,我可以通过以下方式剪切所有较旧的行:
var banana = this.Db.Context.Items.FirstOrDefault(g => g.Id == 3);
var result = query.Where(g => g.CreatedAt < banana.CreatedAt).Take(limit);
var=this.Db.Context.Items.FirstOrDefault(g=>g.Id==3);
var result=query.Where(g=>g.CreatedAt
是否可以通过一个性能良好的EF查询来实现这一点?两个语句的性能并不总是比一个更复杂的语句差,但您可以这样做:
var result = query.Where(g => g.CreatedAt <
this.DbContext.Items.FirstOrDefault(g2 => g2.Id == 3)
.CreatedAt)
.Take(limit);
这仅从数据库中选择一个日期值,而不是指定
query.ToList()
的完整项。尝试只使用。跳过(4)
。您正在尝试按4项分页列表吗?我不知道应该跳过多少元素。这可能有用。谢谢
var createdAt = this.Db.Context.Items
.Where(g => g.Id == 3)
.Select(g => g.CreatedAt)
.FirstOrDefault();
var result = query.Where(g => g.CreatedAt < createdAt).Take(limit);