C# 实体框架 - 按顺序排序和取值

5

我正在尝试从我的数据库中选择5个最旧的条目。我正在使用以下语句:

dbContext.Items.Take(5).OrderBy(i => i.LastCheck).ToListAsync(); 

这里的问题是EF首先从表中取出前5个项目,然后再对它们进行排序。因此,我总是得到表中的前5个条目。但我希望它首先排序项目,然后选择前5个项目,就像执行此SQL命令时一样:

select top 5 * from Items order by LastCheck asc

我在这里得到了正确的结果。

在EF中是否有可能做到这一点,还是我必须执行查询操作?


先排序项目,然后进行“取出”操作... - Gusman
只需要切换您的 OrderBy()Take() - itsme86
只需交换 orderby 和 take 的位置即可... - Norgerman
2个回答

7

你需要交换 Take()OrderBy() 的位置

dbContext.Items.OrderBy(i => i.LastCheck).Take(5).ToListAsync(); 

有趣。因为我按照两个参数排序(OrderBy(i => i.LastCheck).ThenBy...),我试图把Take(5)放在它们之间,但是我得到了一个错误,但我没有尝试把Take放在最后。 就这样,谢谢。 - rimes
ThenBy() 需要一个 IOrderedEnumerable,该接口由 OrderBy() 提供,但不由 Take() 提供。 - fubo
1
您可以将两个排序写成以下形式:dbcontext.Items.OrderBy(x => x.LastCheck).Take(5).OrderBy(y => y.someProp)。这样,第二个 OrderBy 只需要对剩下的 5 个项进行排序,但是它会破坏您按 LastCheck 排序的顺序。 - derpirscher

0

我认为这个问题已经在上面得到了回答,但是:

dbContext.Items.OrderBy(x=>x.LastCheck).Take(5).ToListAsync();

首先执行take first操作,会从列表中选择前5个项目,然后只对这5个项目进行排序。而你想要做的是,先将列表按日期顺序排序,然后再取出前5个。

同样地,如果你想按最新的顺序排序,那么上面的查询语句(以确保排序)就会变成:

dbContext.Items.OrderByDescending(x=>x.LastCheck).Take(5).ToListAsync();

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接