gpt4 book ai didi

sql-server - Entity Framework - SkipWhile

转载 作者:行者123 更新时间:2023-12-05 04:13:53 24 4
gpt4 key购买 nike

我有以下按描述日期排序的行:

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);

是否可以通过单个性能良好的 EF 查询来实现?

最佳答案

两个语句的性能并不总是比一个更复杂的语句差,但您可以这样做:

var result = query.Where(g => g.CreatedAt < 
this.DbContext.Items.FirstOrDefault(g2 => g2.Id == 3)
.CreatedAt)
.Take(limit);

事实上,这是我看到的以 SQL 友好方式模仿 SkipWhile 行为的唯一可能性。

如果您对性能非常严格,则应将其与次优(或可能是最佳)选项进行比较:

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);

这只会从数据库中选择一个日期值,而不是完整的 Item

关于sql-server - Entity Framework - SkipWhile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36236087/

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