2013-07-03 4 views
15

У меня есть,Multi-Group Column Count Linq

Список, MyList, объектов с полями:

string A; 
string B; 

Концептуально, это похоже на два столбца SQL таблицы со столбцами A, B.

Я пытаюсь создать выражение Linq, который будет производить три столбца результирующего набора этого T-SQL на такой концептуальной таблицы:

SELECT A, B, COUNT(B) 
FROM T1 
GROUP BY A, B 

То есть, если у меня есть таблица, такие как:

A  B 
---------- 
x  g 
x  g 
x  g 
x  s 
y  g 
y  g 

Я бы ожидать:

A  B  COUNT(B) 
------------------------- 
x  g   3 
x  s   1 
y  g   2 

Мои лучшие усилия были это:

var result = from MyObjs in MyList 
group MyObjs by new { MyObjs.A, MyObjs.B } into g 
select new { g.Key.A, g.Key.B, g.Key.B.Count() } 

Но граф, как представляется, вернуть общее число B не число B для каждой группы столбцов. Как это можно зафиксировать?

+0

Главное, чтобы отметить, что вы на самом деле не считая B, вы просто считаете (например, в SQL 'count (1)' будет работать так же хорошо). Вот почему ваш ответ интуитивно не работает. У NinjaNye есть решение, прибитое, хотя кажется. :) – Chris

ответ

36

Попробуйте это .... (с верхней части моей головы)

var result = from MyObjs in MyList 
group MyObjs by new { MyObjs.A, MyObjs.B } into g 
select new { g.Key.A, g.Key.B, MyCount = g.Count() } 

Или, если вы предпочитаете ...

var result = MyList.GroupBy(x => new {x.A, x.B}) 
        .Select(g => new {g.Key.A, g.Key.B, MyCount = g.Count()}); 
+2

Принцип правилен, но синтаксис немного на последней строке. Должен быть 'select new {A = g.Key.A, B = g.Key.B, Count = g.Count()}' –

+1

Должны быть названы только рассчитанные значения (например, Count). Именование A и B является необязательным. –