2011-02-16 57 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

相關問題