2010-02-09 69 views
1

這是我試圖轉換爲Linq的SQL查詢。我使用的是對象的通用列表,而不是數據表(如果相關的話)。SQL查詢到Linq GroupBy和Max

Select Max(Date), ID, Property1, Peroperty2 From List Group By ID 

請幫忙。

回答

4

雖然你的SQL是無效的Property1Property2必須是你的聚集的一部分,由ID,Property1,然後Property2的順序是什麼,我相信你這個意志集團正在尋找:

from obj in List 
group obj by new {obj.ID, obj.Property1, obj.Property2 } into g 
select new 
     { 
      ID = g.Key.ID, 
      Property1 = g.Key.Property1, 
      Property2 = g.Key.Property2, 
      MaxDate = g.Max(p => p.Date) 
     } 

這相當於:

Select Max(Date), ID, Property1, Peroperty2 
From List 
Group By ID, Property1, Property2 
+0

謝謝史蒂夫。並對不正確的查詢感到抱歉。但是你明確地給了我我需要的東西。 – Dave

1

正如史蒂夫說的,如果沒有Property1等在聚合子句中,您的SQL無效。然而,它看起來像你正在試圖獲得這些'行'的數據,其中的日期等於'行'組的最大日期由Id?

的工作方式就像是:憑身份證

recs.GroupBy(r => r.Id).SelectMany(g => g.Where(r => r.Date == g.Max(a => a.Date))) 

組,獲取其日期該組的最大日期匹配項目的IEnumeration,並將它們合併爲一個單一的IEnumeration - 然後可以遍歷或任何你想要的。

編輯:順便說一下,在查詢語法我能做的最好的(我花了一段時間...)是一樣的東西:

from r in recs 
where r.Date == 
    (from sr in recs 
    where sr.Id == r.Id 
    select sr.Date).Max() 
select r; 

編輯2:

這其實更像是:

recs.Where(r => r.Date == recs.Where(sr => sr.Id == r.Id).Max(a => a.Date)).Select(r => r) 
用流利的語法,這看起來並不對我很好,因爲我做了第一種方式

...我真的不喜歡的查詢表達式語法,因爲我用得放心SQL這是搞笑並查詢語法應該更像SQL。