如何使用Linq获取与Max(值)相邻的值?

时间:2012-11-30 18:59:34

标签: c# sql 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

我无法弄清楚如何在不做一些循环的情况下获得物种名称。这可能吗?处理关系的策略是什么?

3 个答案:

答案 0 :(得分:4)

这在LINQ2SQL中比在SQL中更简单:

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

这将返回BasalAreaGroup最大值SpeciesName的项目列表以及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

在SQL中,您需要联接回原始表,如下所示:

{{1}}

答案 1 :(得分:2)

试试这个:

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

答案 2 :(得分: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