2015-11-21 70 views
1

我需要显示来自跟踪日志和group的ClientId和Last Activity日期的最后一个活动。我的代码工作正常。Linq GroupBy Max和add列

我现在需要添加另一列到结果这是“备忘录”字段。

结束查询将由ClientId的上次跟踪日期和该行中的“备忘录”字段。

工作守则(无备注字段)

var q =(
from t in Trackings 
group t by t.ClientID into g 
select new {ClientID = g.Key, Date = g.Max(x=>x.TrackDate)} 
).ToList(); 

结果:

46, 10/29/2015 12:09:42 PM 
69, 11/1/2015 5:44:47 AM 
29, 11/6/2015 12:55:21 PM 

预期的效果

46, 10/29/2015 12:09:42 PM, User Login 
69, 11/1/2015 5:44:47 AM, Update Account 
29, 11/6/2015 12:55:21 PM, User Login 

如何添加另一列之后的的GroupBy和MAX选择已完成并获得ROW的备忘录?

回答

3

我觉得这种查询的最简便的方法是通过日期降序排序,并采取的第一条记录:

var q =(from t in Trackings 
     group t by t.ClientID into g 
     let lastTracking = g.OrderByDescending(x => x.TrackDate).FirstOrDefault() 
     select new 
     { 
      ClientID = g.Key, 
      Date = lastTracking.TrackDate, 
      Memo = lastTracking.Memo 
     }).ToList(); 
+1

是的,你是正确的+1。你可以只是警告OP可能会因为'FirstOrDefault'而发生NRE。 –

+1

这是对的,但我把它留给OP。 “跟踪”可能是来自SQL后端的“IQueryable”,在这种情况下,空检查不适用。 –

+1

@RahulSingh NRE从来没有发生过分组没有额外的过滤器。通常情况下,人们会使用'First',但由于某种未知的原因,EF不喜欢它,而是需要'FirstOrDefault'。 –

0

您需要添加

var q =(
from t in Trackings 
group t by t.ClientID into g 
select new {ClientID = g.Key, Date = g.Max(x=>x.TrackDate),MemoField=g.First().select(x=>x.MemoField)} 
).ToList(); 
+0

都能跟得上 - 导致所有备忘录字段..不只是1的行。 –

+0

见编辑答案 –

+0

这将获取每个组中的第一个项目。 –