2012-11-30 53 views
2

我有一个表:如何使用Linq获取最大值(值)附近的值?

Group | BasalArea | SpeciesName 
1  | 3.6  | Palustris 
1  | 45.0  | MSO 
2  | 4.2  | Oak 
2  | 2.0  | MSO 
... 

从这个表,我想与本集团场分组最高的断面积,这将是这样获得的品种名称:

Group | BasalArea | SpeciesName 
1  | 45.0  | MSO 
2  | 4.2  | Oak 

使用SQL,我可以得到最高的基面积:

SELECT Group, Max(BasalArea) 
FROM TABLE 
GROUP BY Group 

我不知道如何还没有做一些循环获得物种名称。这可能吗?处理关系的策略是什么?

回答

4

这是LINQ2SQL比SQL简单:

var res = source.MyTable 
    .GroupBy(item => item.Group) 
    .Select(g => g.OrderByDescending(item => item.BasalArea).First()) 
    .ToList(); 

这将在其GroupSpeciesName返回的项目与BasalArea最大值列表,在一起。

在SQL你需要加入回原来的表,如下所示:

SELECT * FROM TABLE b 
JOIN (
    SELECT Group, Max(BasalArea) as BasalArea 
    FROM TABLE 
    GROUP BY Group 
) t on t.Group = b.Group AND t.BasalArea = b.BasalArea 
+0

感谢两个LINQ和SQL这样做。两种方式都很有用。 – canisrufus

+0

它不能正常工作。它会得到最低价值。 –

+0

@canisrufus我编辑了答案,用'OrderByDescending'替换'OrderBy'来确保你得到'max'而不是'min'。 – dasblinkenlight

1

说什么sasblinkenlight将是LINQ。出于好奇,这是一个潜在的SQL解决方案。

SELECT grouped.Group, raw.SpeciesName, grouped.MaBasalArea 
FROM (
     SELECT Group, MAX(BasalArea) as MaxBasalArea 
     FROM TABLE 
     GROUP BY Group 
    ) grouped 
INNER JOIN TABLE raw ON grouped.MaxBasalArea = raw.BasalArea AND grouped.Group = raw.Group 
2

试试这个:

var froup = categories.GroupBy(g => new {g.CategoryType}) 
          .Select(g => g.OrderByDescending(i => i.CategoryID).First()) 
          .ToArray(); 
相关问题