2013-06-25 9 views
12

Ho una tabella di dati come questo:query LINQ per riassumere dal gruppo

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 

che ho bisogno di Gruppo e Sum a questo:

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

In altre parole ho bisogno di sommare i due Ore di raggruppamento delle colonne in base alle colonne Categoria e Descrizione.

So che potrei costruire una nuova tabella e passare in rassegna i dati esistenti e sommare i dati nella nuova tabella ma ho pensato che ci sarebbe stato un modo più semplice per farlo usando Linq. L'ho cercato su google per alcune ore, ma tutti gli esempi che ho trovato non sembravano adattarsi a quello che stavo cercando di fare.

BTW, il driver odbc che crea la tabella di dati non ha la capacità per le sottocategorie, ecc. O l'avrei appena fatto usando SQL.

Grazie,

John

risposta

30

Usa oggetto anonimo al gruppo per categoria e la descrizione. Ecco query LINQ to DataSet che restituisce ora raggruppate:

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

Se si sta interrogando banca dati (non è chiaro da domanda):

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

Ha funzionato. Grazie mille. A proposito, come hai fatto ad allineare le mie colonne così perfettamente? Ho provato a capirlo e ho fallito. – John

+2

@John Ho selezionato le tabelle e formattato come codice (conserva gli spazi bianchi) :) –

+2

@SergeyBerezovskiy grazie per aver fornito entrambe le versioni, ** veramente incredibile ** :) –

0

È necessario sommare CurrentHours e CTDhours, quindi -

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