【问题标题】:C# Entity Framework - Order by and TakeC# 实体框架 - 按顺序排列
【发布时间】:2016-08-20 11:42:50
【问题描述】:

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

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

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

select top 5 * from Items order by LastCheck asc

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

是否有可能在 EF 中执行此操作,还是我必须执行查询?

【问题讨论】:

  • 先订购商品,再订购...
  • 只需切换您的OrderBy()Take()
  • 只需交换orderby的位置并拿下....

标签: c# sql entity-framework select sql-order-by


【解决方案1】:

认为上面已经回答了这个问题,但是:-

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

先取,会从列表中选择前 5 项,然后只对这 5 项进行排序,而您要做的是先将列表按日期顺序排序,然后取前 5 项。

类似地,如果您想按最新排序,则上述查询(以确保已排序)将变为:-

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    你必须切换Take()OrderBy()

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

    【讨论】:

    • 有趣。由于我按 2 个参数排序 (OrderBy(i => i.LastCheck).ThenBy...) 我试图将 Take(5) 放在它们两个之间,但我得到了一个错误,但我没有尝试将 Take 放在结尾。就是这样,谢谢
    • ThenBy() 需要由OrderBy() 提供但不是Take() 提供的IOrderedEnumerable
    • 你可以将你的两个订单写成如下dbcontext.Items.OrderBy(x=> x.LastCheck).Take(5).OrderBy(y=> y.someProp) 这样,第二个OrderBy 只需要对剩下的5个项目进行排序,但是LastCheck当然会破坏你的订单。
    猜你喜欢
    • 2014-07-11
    • 2012-04-13
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多