2011-02-16 67 views
5

必须做到这一点,我只是找不到它。分组项目,并从每个组中选择特定项目与LINQ

鉴于此查询:

from x in new XPQuery<XPContent>(s) 
select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date } 

,我需要选择与每个不同的内容识别最大的日期记录。这可以用LINQ巧妙地完成吗?现在我正在这样做:

var q = (from x in new XPQuery<XPContent>(s) 
      select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date }).ToList(); 

var r = q.ToLookup(item => item.ContentID); 
foreach (var rItem in r) { 
    var s = rItem.OrderByDescending(a => a.Date).First(); 
    /* do stuff with s */ 
} 

...但ToLookup感觉有点笨重。或者我拥有最好的(最简单的)解决方案?

此外,我知道我不应该使用ToList,但请暂时忽略它。

提前致谢!

回答

6

我想你想:

var q = from x in new XPQuery<XPContent>(s) 
     group x by x.ContentID into g 
     let latest = g.OrderByDescending(a => a.Date).First() 
     select new 
     { 
      latest.Category, latest.ContentType, 
      latest.Name, latest.ContentID, latest.Date 
     }; 

(请注意,有从一组找到“最大”元素比第一分选它,例如用MaxBy运营商的更高性能的方式)

查询非常简单;它只是将项目按其ContentId分组,然后从每个组中选择一个从该组的最新项目生成的匿名类型的实例。

+2

从来不知道'让' - 谢谢! – 2011-02-18 04:24:14