2012-10-05 7 views
0

Avoir un peu de mal à construire une instruction linq (C#, syntaxe de requête mais je pourrais gérer la méthode sytax). Il doit prendre en charge le groupement ainsi que l'exposition d'une propriété calculée. J'ai une poignée sur chacun individuellement mais je n'arrive pas à les faire sembler fonctionner ensemble. Toute aide serait appréciée.linq valeur calculée avec groupe par

données

GrpField   Qty  Price 
-------------  ---  ----- 
RED    1  10 
RED    2  10 
RED    1  50 
BLUE    2  30 
BLUE    2  50 

sortie doit être la somme des Prix total (Qté * Prix) pour chaque groupe

Résultat désiré

RED 80 
BLUE 160 

Cela me obtient le total Ligne de prix

from x in origdata 
let linetotal = x.qty * x.price 
select new { x.grpfield, x.qty, x.price, linetotal } 

Mais je ne peux pas regrouper par le nouveau type anonyme puisque vous ne pouvez pas exécuter des agrégats comme somme sur des types anonymes. Si je cours d'abord le groupe, je ne peux pas comprendre comment travailler le linetotal dans le mélange AVANT la somme globale.

Répondre

3

Comme preuve contre vos puisque vous ne pouvez pas exécuter des agrégats comme somme sur les types anonymes déclaration ...

var data = new[] 
    { 
     new {GrpField = "RED", Qty = 1, Price = 10}, 
     new {GrpField = "RED", Qty = 2, Price = 10}, 
     new {GrpField = "RED", Qty = 1, Price = 50}, 
     new {GrpField = "BLUE", Qty = 2, Price = 30}, 
     new {GrpField = "BLUE", Qty = 2, Price = 50}, 
    }; 

var grouped = 
    from d in data 
    group d by d.GrpField 
    into g 
    select new {Group = g.Key, Sum = g.Sum(x => x.Qty * x.Price)}; 

foreach(var g in grouped) 
    Console.WriteLine("{0} - {1}", g.Group, g.Sum); 
+0

Cette déclaration n'a pas été mon opinion - ce fut le compilateur erreur (et dans la documentation MS) si vous prenez ma requête d'origine et essayez d'exécuter le groupe par le type anon. L'astuce (comme en témoignent vos réponses et d'autres) était de faire le groupe en premier. – ktharsis

2

Groupez d'abord, puis additionnez l'opération.

origdata.GroupBy(m => m.GrpField) 
.Select(group => new { 
    GrpField = group.Key, 
    CalculatedValue = group.Sum(m => m.qty * m.price) 
    }); 
1
origdata.GroupBy(p=>p.GrpField) 
.Select(p=> new() 
{ 
    GrpField=p=>p.Key, 
    Sum=p.Sum(q=>q.Qty*q.Price) 
})