Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 实体框架-SkipWhile_Sql Server_Entity Framework_Linq - Fatal编程技术网

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