web-dev-qa-db-fra.com

Requête Linq à additionner par groupe

J'ai une table de données comme celle-ci: 

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  

Que j'ai besoin de groupe et somme à ceci: 

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

En d'autres termes, je dois additionner les deux colonnes Heures en les regroupant dans les colonnes Catégorie et Description.

Je sais que je pourrais construire une nouvelle table et parcourir les données existantes et les additionner dans la nouvelle table, mais je pensais qu'il serait plus simple de le faire avec Linq. Je l'ai googlé pendant quelques heures mais tous les exemples que j'ai trouvés ne semblaient pas correspondre à ce que j'essayais de faire.

BTW, le pilote odbc qui crée la table de données n’a pas la capacité de sous-requêtes, etc. ou je l’aurais juste fait en utilisant SQL.

13
John

Utilisez un objet anonyme pour regrouper par catégorie et description. Voici la requête Linq to DataSet qui renvoie les heures groupées:

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

Si vous interrogez la base de données (la question n'est pas claire):

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)
}
31
Sergey Berezovskiy

Vous devez additionner CurrentHours et CTDhours, donc -

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