1

我有一个 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};
4

2 回答 2

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};

(当然,假设您想要每个组中的最大值。)

于 2010-07-09T15:16:37.773 回答
1

乔恩的回答很好,我只是想详细说明一下原因:

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

r 超出范围...这是为什么呢?

结束查询的两种方式是selectorgroup by子句。当您将查询延续子句添加into g到 时group by,您是在说 - 查询的顶级元素是,g并且到目前为止在查询中引入的所有变量都将从范围中删除。

如果您在这篇 msdn 文章中搜索splice一词,您可以看到示例。

不要混淆intowith的这种用法join on equals into,它是组连接,而不是查询延续。组加入不会从范围中删除以前的变量。

于 2010-07-09T15:37:10.400 回答