2010-07-26 15 views
1

我可能就無法解釋這個還不錯,但這裏有雲......LINQ分組:選擇行而不是密鑰?

我有一個類似的表:

Id | Foreign_Key_Id | A_Number | Some_Other_Info 
1  1    100   Red 
2  1    200   Blue 
3  1    300   Orange 
4  2    100   Green 
5  2    200   Yellow 
6  3    100   Brown 

我想要得到的最大「A_Number」對於此表中的特定「Foreign_Key_Id」,還要返回記錄的其餘部分,以便從「Some_Other_Info」列中獲取信息。

我發現我可以通過這樣的查詢做到這一點:雖然我不能肯定它記錄

from x in This_Table 
group x by x.Foreign_Key_Id into g 
let maxANumber = g.Max(x => x.A_Number) 
orderby maxANumber descending 
select g.Where(x => x.A_Number == maxANumber).First() 

from x in This_Table 
group x by x.Foreign_Key_Id into g 
orderby g.Max(x => x.A_Number) descending 
select g.Where (x => x.Foreign_Key_Id == g.Key).OrderByDescending (x => x.A_Number).First() 

編輯:或者,也許這更簡潔查詢如果一個Foreign_Key_Id具有兩個具有相同「A_Number」值的記錄(這在我所指的表中是可能的,那麼我只需要取最近的一個)。

我相信這在我的例子將返回:

Id | Foreign_Key_Id | A_Number | Some_Other_Info 
3  1    300   Orange 
5  2    200   Yellow 
6  3    100   Brown 

好像必須有一種方式,更簡單的方式來做到這一點(這使得比我想出了一個更快的查詢),我只是無法弄清楚如何。

在此先感謝。

回答

1

以下也有效。您可以訂購組內:

from x in This_Table 
group x by x.Foreign_Key_Id into g 
select g.OrderByDescending(y => y.A_Number).First(); 

拍攝時A_Number s爲等於最近的記錄是爲增加另一個OrderBy到查詢一樣簡單。

+0

謝謝。比我醜陋的解決方案更簡潔。 – Ocelot20 2010-07-26 14:28:46