2010-05-03 60 views
7

我有一个简单的LINQ to Enities表,查询和使用日期字段选择使用LINQ到实体

所以,我想这个代码获得最近的记录最近的记录有没有其他办法可以做到这一点? 非常感谢!

+0

按日期时间分组没有意义。如果分辨率是毫秒,那么你不可能有一个组中有多个项目。或者这真的是日期字段? – 2010-05-03 21:20:01

回答

0

所以答案是:

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

这将返回最近的记录。

+0

这将返回一个新对象{Key,Date} 有没有办法返回相同的“alert”对象? – Begemotya 2010-05-06 13:16:22

+0

我被卡在你的评论在这里。在我的测试中, m也会得到{Key,Date},但是你已经标记为已解决。你如何获得警告对象? – Jacques 2017-02-14 12:34:38

4

如果没有一个理由组,你可能只是切换您的查询了一点:

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

这将在查询时将整个数据库加载到内存中... – 2010-05-03 21:09:05

+0

@BlueRaja - 实际上它不会执行任何操作。直到你对像.First()或.Take(10)这样的latestAlerts做些什么之后,才会发生数据库命中。 – 2010-05-03 21:18:09

+2

@hightechrider:因此,“当被查询时”...大概,海报正在寻找一个完整的答案。 – 2010-05-03 21:19:42

0

应该

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

GroupBy肯定是通过LINQ到支持-Entities

+0

它不工作,“按g.key排序”是“红色” - >“查询正文必须以select子句或组子句结尾 – Begemotya 2010-05-04 12:54:27

+0

任何我需要通过2个字段”UpdateDateTime“和”Id“进行分组的方法为了获得每个ID的最近记录 – Begemotya 2010-05-04 12:57:37

8

我有类似的需求。我想要返回类型化记录,而不是新的匿名对象。要做到这一点.First()可以提供帮助。

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

使用OrderByDescending命令对它们进行排序,并使用First()将其排在第一位。你已经用你的标识符对它们进行了分组,所以你只应该得到每个标识符的最新记录。

+1

不得不使用FirstOrDefault(),但是很好用。 – Joshua 2014-05-29 15:56:06