Linq Grouping - 聚合,在一组之外

时间:2010-07-09 15:15:06

标签: sql linq group-by linq-group

我有一个SQL查询,其工作原理如下:

SELECT TOP 100 
    Max(Table_ID) as Max_ID, 
Col1,
Col2,
Col3,
COUNT(*) AS Occurences
FROM myTable
GROUP BY Col1, Col2, Col3
ORDER BY Occurences DESC

如何编写相同的Linq查询?

问题是,只要我应用分组,就我的情况而言,我无法访问未分组的列 Table_ID

var errors = from r in MyTable
    group e by new {e.Col1, e.Col2} into g
    orderby g.Count() descending
    select new {MaxId = ???, Count =  g.Count(), g.Key.Col1, g.Key.Col2};

2 个答案:

答案 0 :(得分:4)

使用g.Max(x => x.TableID)

var errors = from r in MyTable
    group e by new {e.Col1, e.Col2} into g
    orderby g.Count() descending
    select new {MaxId = g.Max(x => x.TableID), 
                Count =  g.Count(), g.Key.Col1, g.Key.Col2};

(假设你想要每组中的最大值。)

答案 1 :(得分:1)

Jon的回答很好,我只想详细说明原因:

  

问题是,一旦我应用我的分组,我就无法访问未分组的列

r超出了范围......为什么会这样?

结束查询的两种方法是selectgroup by子句。当你将查询延续条款into g添加到group by时,你会说 - 查询的顶级元素是g,并且在此之前查询中引入的所有变量都将被删除来自范围。

如果您在this msdn article搜索单词拼接,则可以看到示例。

请勿将此into的使用与join on equals into混淆,{{1}}是群组加入,而不是查询延续。组连接不会从范围中删除先前的变量。