【问题标题】:Return record with max column value using Entity Framework 6使用 Entity Framework 6 返回具有最大列值的记录
【发布时间】:2017-11-20 23:51:55
【问题描述】:

尝试获取 ReceivedDateTime 列的最大 datetime 值的记录,但是数据集应由某些 Id 列进行预过滤(不是唯一的)。以这种方式解决:

using (var db = new SystemEntities())
{
    var records = db.Table.Where(p => p.Id == Id);
    var record = records.Where(p => p.ReceivedDateTime == records.Max(r => r.ReceivedDateTime)).FirstOrDefault();
    if(record != null)
    {

    }
}

有没有更漂亮、更简单、更短的实现、符号?谢谢!

【问题讨论】:

  • 如果有平局怎么办?
  • @GertArnold,“领带”?
  • 是的,两条记录,相同的 ID,相同的日期。
  • @GertArnold 不可能 - 它是日期时间,保存当前日期时间和 id,不能同时出现。

标签: c# sql .net linq entity-framework-6


【解决方案1】:

您可以使用OrderByDescending 进行如下简化:

using (var db = new SystemEntities())
{
    var record = db.Table.Where(p => p.Id == Id).OrderByDescending(x => x.ReceivedDateTime).FirstOrDefault();
    if(record != null){}
}

【讨论】:

    【解决方案2】:

    更新

    在我打开问题并尝试结果之间,原始答案已得到修复。很抱歉在我发布之前没有检查。

    更新

    鉴于我无法评论,我将在旁边发布答案。

    上面建议的var record = db.Table.Where(p => p.Id == Id).Max(x => x.ReceivedDateTime).FirstOrDefault() 将无法编译,因为 Max 将为您返回一个日期时间。

    您可以像在 SQL 语句中那样使用 OrderByDescending 来做到这一点

    // I used an in memory array but it should be the same.
    var item = items.Where(x => x.Id == 2).OrderByDescending(x => x.ReceivedDate).FirstOrDefault();
    

    【讨论】:

    • 鉴于我无法发表评论,我将在旁边发布答案 好吧,这不是答案部分的用途。你只需要等到你可以发表评论。没有理由只是重复给定的答案,您可能已经删除了您的帖子。
    • 嗨@GertArnold,在我第一次发布时,答案还没有出现。至少当我打开写这篇文章的时候。我帖子中的内联代码是当时答案的样子。我想指出发生了什么但不能。我打开VS写出代码,然后我把它贴回这里并发布。然后我发现之前的答案已经更新了。我现在可以发表评论,这样就不会再发生这种情况了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多