2010-01-14 11 views
0

J'essaie d'additionner le coût d'une série d'articles groupés par l'organisation d'une personne. Je crois que la sommation fonctionne correctement, mais je ne vois pas mon regroupement. Les objets stockés dans rollup contiennent uniquement la valeur de la somme. Je m'attendrais à ce qu'ils aient l'organisation en plus de la somme des coûts pour cette organisation. Qu'ai-je manqué dans cette expression?En regroupant les problèmes en C# par valeur, puis en additionnant

var rollup = OrgPersonList.GroupBy(
    person => person.Person.Org).Select(group => 
     group.Sum(price => price.Items.Sum(item => 
      item.Cost))); 

Répondre

1

Eh bien, vous êtes seulement sélectionner la somme - si vous voulez la clé aussi bien, vous devez le sélectionner. Par exemple:

var rollup = OrgPersonList.GroupBy(x => x.Person.Org) 
    .Select(group => new { group.Key, 
          Sum =group.Sum(x => x.Items.Sum(item => item.Cost))}); 

Notez que je l'ai utilisé x plutôt que person ou price comme il semble le même article englobera à la fois.

Ou comme une expression de requête:

var rollup = from x in OrgPersonList 
      group x by x.Person.Org into grouped 
      select new { grouped.Key, 
          Sum =grouped.Sum(x => x.Items.Sum(item =>item.Cost))}); 

(un peu serré pour Whitespace mise en forme ...)

Alternativement encore, le groupe ... par pourrait calculer la somme pour chaque entrée, de sorte que le résultat juste besoin d'être la somme des entrées du groupe:

var rollup = from x in OrgPersonList 
      group x.Items.Sum(item => item.Cost) by x.Person.Org into grouped 
      select new { grouped.Key, Sum = grouped.Sum() }); 
+0

les noms variables simple lettre d'un style * * choix ou un mécanisme d'enseignement pour les expressions LINQ/lambda? – ahsteele

+1

@ahsteele: Je n'avais aucune information sur les éléments d'un OrgPersonList, donc c'était difficile de trouver un meilleur nom. Il est vrai que les noms de lettres simples sont assez pratiques dans les requêtes LINQ * si * elles sont faciles à comprendre. Dans ce cas, c'était plus pour la nécessité - je voulais être cohérent dans mes utilisations du même type (par opposition à utiliser «personne» et «prix» pour le même type d'objet). –

+0

@Jon Existe-t-il une différence de performance entre ces options ou est-ce une question de préférence? – ahsteele