2013-06-25 14 views
12

Ich habe eine Datentabelle wie folgt aus:Linq Abfrage von Gruppe zusammenzufassen

Category   Description  CurrentHours  CTDHours 
LC1    Cat One     5    0 
LC2    Cat Two     6    0 
LC3    Cat Three    18    0 
LC1    Cat One     0    9 
LC2    Cat Two     0    15 
LC4    Cat Four    0    21 

Dass ich zu der Gruppe und Sum dazu brauchen:

Category   Description  CurrentHours  CTDHours 
LC1    Cat One     5    14 
LC2    Cat Two     6    21 
LC3    Cat Three    18    0 
LC4    Cat Four    0    21 

Mit anderen Worten: Ich brauche die beiden zu fassen Stundenspalten, die nach den Spalten Category und Description gruppieren.

Ich weiß, dass ich eine neue Tabelle und Schleife durch die vorhandenen Daten erstellen und die Daten in die neue Tabelle summieren könnte, aber ich dachte, es wäre eine einfachere Möglichkeit, es mit Linq zu tun. Ich habe es für ein paar Stunden gegoogelt, aber all die Beispiele, die ich gefunden habe, schienen nicht zu dem zu passen, was ich versuchte.

BTW, der ODBC-Treiber, der die Datentabelle erstellt, hat nicht die Fähigkeit für Unterabfragen usw., oder ich hätte es gerade mit SQL getan.

Danke,

John

Antwort

30

Verwenden anonymes Objekt Gruppe nach Kategorie und Beschreibung. Hier ist Linq zu Datasetabfrage die gruppierten Stunden zurück:

from r in table.AsEnumerable() 
group r by new { 
    Category = r.Field<string>("Category"), 
    Description = r.Field<string>("Description") 
} into g 
select new { 
    Category = g.Key.Category, 
    Description = g.Key.Description, 
    CurrentHours = g.Sum(x => x.Field<int>("CurrentHours"), 
    CTDHours = g.Sum(x => x.Field<int>("CurrentHours") + x.Field<int>("CTDHours")) 
} 

Wenn Sie Datenbank abfragen (nicht klar von Frage):

from r in context.Table 
group r by new { 
    r.Category, 
    r.Description 
} into g 
select new { 
    g.Key.Category, 
    g.Key.Description, 
    CurrentHours = g.Sum(x => x.CurrentHours), 
    CTDHours = g.Sum(x => x.CTDHours + x.CurrentHours) 
} 
+0

Das hat funktioniert. Vielen Dank. Übrigens, wie hast du meine Säulen so perfekt ausgerichtet? Ich versuchte es herauszufinden und scheiterte. – John

+2

@John Ich wählte Tabellen und formatiert als Code (es behält Whitespaces) :) –

+2

@SergeyBerezovskiy Danke für beide Versionen, ** wirklich erstaunlich ** :) –

0

Sie müssen CurrentHours zusammenzufassen und CTDhours, so -

select new { 
    ... 
    CTDHours = g.Sum(x => x.Field<int>("CTDHours") + g.Sum(x => x.Field<int>("CurrentHours") 
}