Linq Grouping - совокупность вне группы по - PullRequest
1 голос
/ 09 июля 2010

У меня есть запрос 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 ]

4 голосов
/ 09 июля 2010

Использование 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 голос
/ 09 июля 2010

Хороший ответ Джона, я просто хочу пояснить, почему:

Проблема в том, что как только я применяю свою группировку, я не могу получить доступ к несгруппированным столбцам

г вышел из области видимости ... почему?

Два способа завершения запроса - это предложения select или group by. Когда вы добавляете условие продолжения запроса into g к group by, вы говорите - элементами верхнего уровня запроса являются g, и все переменные, введенные в запрос до этого момента, удаляются из области.

Если вы ищете в этой статье MSDN для слова сращивание , вы можете увидеть образцы.

Не путайте это использование into с join on equals into, которое является групповым объединением, а не продолжением запроса. Групповое объединение не удаляет предыдущие переменные из области.

...