LINQ分组:选择行而不是密钥?

问题描述:

我可能就无法解释这个还不错,但这里有云......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 

好像必须有一种方式,更简单的方式来做到这一点(这使得比我想出了一个更快的查询),我只是无法弄清楚如何。

在此先感谢。

以下也有效。您可以订购组内:

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