2013-07-03 18 views
15

ho,Multi-Gruppo Colonna Conte Linq

Un elenco, MyList, di oggetti con campi:

string A; 
string B; 

Concettualmente, questo è simile a una tabella SQL a due colonne con le colonne A, B.

sto cercando di creare un'espressione LINQ che avrebbe prodotto i tre colonna dei risultati insieme di questo T-SQL su un tavolo come concettuale:

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

Cioè, se ho avuto una tabella come:

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

mi aspetterei:

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

miei migliori sforzi sono stati questo:

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() } 

Ma il conteggio sembra restituire il numero totale di B non il numero di B per gruppo di colonne multiple. Come si puo aggiustare?

+0

La cosa fondamentale da notare è che non siete veramente contando B, stai solo contando (ad esempio nel conteggio di SQL (1) 'funzionerebbe altrettanto bene). Questo è il motivo per cui la tua risposta intuitivamente non funziona. NinjaNye ha la soluzione inchiodata anche se sembra. :) – Chris

risposta

36

Prova questo .... (la parte superiore della mia testa)

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() } 

Oppure, se preferite ...

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

Il principio è corretto ma la sintassi è un po 'spenta nell'ultima riga. Dovrebbe essere 'selezionare new {A = g.Key.A, B = g.Key.B, Count = g.Count()}' –

+1

Solo i valori calcolati (ad esempio Count) devono essere denominati. La denominazione A e B è facoltativa. –