【问题标题】:Select most recent records using LINQ to Entities使用 LINQ to Entities 选择最近的记录
【发布时间】:2010-05-03 20:46:08
【问题描述】:

我有一个简单的 Linq to Enities 表来使用日期字段查询和获取最新记录

所以我尝试了这段代码:

IQueryable<Alert> alerts = GetAlerts();
IQueryable<Alert> latestAlerts =
    from a in alerts
    group a by a.UpdateDateTime into g
    select g.OrderBy(a => a.Identifier).First();

错误: NotSupportedException:不支持“GroupBy”方法。

还有其他方法可以做到吗? 非常感谢!

【问题讨论】:

  • 按日期时间分组没有意义。如果分辨率是毫秒,那么您不太可能拥有一个包含多个项目的组。还是这真的是一个日期字段?

标签: c# linq linq-to-entities


【解决方案1】:

我也有类似的需求。我想取回输入的记录,而不是新的匿名对象。为此,.First() 可以提供帮助。

var query = from alert in m_alerts
        group alert by alert.Identifier into a
        select a.OrderByDescending(g => g.UpdateDateTime).First();

使用 OrderByDescending 对它们进行排序,并使用 First() 取顶部。您已按标识符对它们进行分组,因此您应该只获取每个标识符的最新记录。

【讨论】:

  • 不得不使用 FirstOrDefault(),但效果很好。
  • @Joshua 为什么你需要在这里使用 FirstOrDefault?
  • 如果我没记错的话,在某些情况下,我是带着一个空集进来的,所以运行 .First() 会引发异常。我不想要异常,我只是想要一个空值以便稍后检查。
【解决方案2】:

如果没有理由对它进行分组,您可以稍微调整一下查询:

IQueryable<Alert> alerts = GetAlerts();
IQueryable latestAlerts = alerts.OrderByDescending(a => a.UpdateDateTime);

【讨论】:

  • @BlueRaja - 实际上它不会做任何事情。除非您使用 .First() 或 .Take(10) 之类的 latestAlerts 进行操作,否则不会发生数据库命中。
  • @hightechrider:因此,“当被查询时”......大概,发帖人正在寻找一个完整的答案。
【解决方案3】:

应该是

IQueryable<Alert> latestAlerts =
    (from a in alerts
    group a by a.UpdateDateTime into g
    order by g.Key
    select g).First();

GroupBy 绝对支持 Linq-to-Entities

【讨论】:

  • 它不起作用,“按 g.key 排序”为“红色”->“查询正文必须以 select 子句或 group 子句结尾
  • 任何方式我都需要按 2 个字段“UpdateDateTime”和“Id”进行分组,以获得每个 id 的最新记录
【解决方案4】:

所以答案是:

var query =
    from alert in m_alerts
    group alert by alert.Identifier
          into g 
          select new 
          {
        GroupIdentifier = g.Key,
        UpdateDateTime = g.Max(p => p.UpdateDateTime) 
          };

这将返回最近的记录。

【讨论】:

  • 这将返回一个新对象 {Key, Date} 有没有办法返回相同的“警报”对象?
  • 我在这里坚持你的评论。在我的测试中,我也得到了 {Key, Date} 但您已将其标记为已解决。如何获取警报对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
相关资源
最近更新 更多