LINQ-Gruppierung nach mehreren Feldern - Syntaxhilfe

73

Was ist die Korrektur, die zum Beispiel 2 benötigt wird, um nach mehreren Spalten zu gruppieren?

Beispiel 1

var query = from cm in cust
            group cm by new { cm.Customer, cm.OrderDate } into cms
            select
            new 
            { Key1 = cms.Key.Customer,Key2=cms.Key.OrderDate,Count=cms.Count() };

Beispiel 2 (falsch)

   var qry = 
   cust.GroupBy(p => p.Customer, q => q.OrderDate, (k1, k2, group) =>
   new { Key1 = k1, Key2 = k2, Count = group.Count() });
Udana
quelle

Antworten:

136

Verwenden Sie in der Punktnotation denselben anonymen Typ wie im Abfrageausdruck:

var qry = cust.GroupBy(cm => new { cm.Customer, cm.OrderDate }, 
             (key, group) => new { Key1 = key.Customer, Key2 = key.OrderDate, 
                                   Count = group.Count() });

(In einer echten IDE hätte ich mich (key, group)unter dem cmParameter aufgereiht , aber dann würde es in SO eingeschlossen.)

Jon Skeet
quelle
Jon, ich mache immer Fehler bei der Verwendung der Erweiterungsmethode. Gibt es eine einfache Möglichkeit, sich damit vertraut zu machen?
Udana
@Udana: Ich fand es sehr hilfreich zu sehen, was der C # -Compiler mit Abfrageausdrücken macht - aber ich bin ein spezifikationsbasierter Typ. Ein Blick auf die verfügbaren Überlastungen und das Lesen der Dokumentation hilft auch sehr :)
Jon Skeet
@ Jon Skeet: Diese Überladung von GroupBy()hat in MSDN nicht viel Beschreibung. Können Sie bitte eine Zeile darüber schreiben?
FMFF
4
@FMFF: ( msmvps.com/blogs/jon_skeet/archive/2011/01/01/… ) Soweit ich das beurteilen kann, ist diese Überlastung groupBy(x=>x.y, (key,group)=>[lambda with group and key])nur eine kürzere Ausdrucksweise GroupBy(x=>x.y).select(group=>[lambda with group and group.key]), und die zweite scheint besser lesbar zu sein
HugoRune
4
Ich finde, dass die Verwendung von Linqpad auch ein paar Dinge lehrt, da Sie zwischen Lambda und SQL wechseln können, nachdem Sie etwas in Linq "von foo in bar select foo" -Syntax geschrieben haben
Jim Wolff