LINQ Group By und Sammlung auswählen

72

Ich habe diese Struktur

Customer
 - has many Orders
  - has many OrderItems

Ich möchte eine Liste von CustomerItemsvia LINQ mit einer Teilmenge von OrderItems:

List of new { Customer, List<OrderItem> Items }

Dies ist eine Gruppierung aller Artikel, die ein Kunde aus der Teilmenge der Artikel bestellt hat

Wie kann ich mit LINQ die Bestellung zurückverfolgen und nach Kunden gruppieren, um dieses Objekt zu generieren?

Bisher bin ich auf so etwas

items
 .GroupBy(i => i, i => i.Order.Customer, (i, customer) => new {customer, i})

Aber das ist offensichtlich keine Liste. Ich schätze, ich brauche irgendwo ein SelectMany, könnte aber einige Hinweise gebrauchen.

jenson-button-event
quelle

Antworten:

135

Ich denke du willst:

items.GroupBy(item => item.Order.Customer)
     .Select(group => new { Customer = group.Key, Items = group.ToList() })
     .ToList() 

Wenn Sie die Überlastung, die GroupBySie derzeit verwenden, weiterhin verwenden möchten , können Sie Folgendes tun:

items.GroupBy(item => item.Order.Customer, 
              (key, group) =>  new { Customer = key, Items = group.ToList() })
     .ToList() 

... aber ich persönlich finde das weniger klar.

Ani
quelle
Benötigen Sie den ToList () -Aufruf für die Gruppe? Wäre die letzte ToList () nicht genug?
Joanna Derks
2
@ Joanna: Gemäß den Anforderungen des OP muss die ItemsEigenschaft des anonymen Typs eine Liste sein.
Ani
Können Sie bitte etwas Unterstützung dafür bieten
Si8
6

Das könnte dir auch gefallen

var Grp = Model.GroupBy(item => item.Order.Customer)
      .Select(group => new 
        { 
             Customer = Model.First().Customer, 
             CustomerId= group.Key,  
             Orders= group.ToList() 
       })
      .ToList();
Caras
quelle
Warum bekomme ich es item.Field<>und nicht .Orderzum Beispiel? Ich verwende eine DataTable.
Si8
2

Sie können es mit Gruppenbeitritt erreichen

var result = (from c in Customers
          join oi in OrderItems on c.Id equals oi.Order.Customer.Id into g
          Select new { customer = c, orderItems = g});

c ist Kunde und g ist der Kunde, der Artikel bestellt.

Cimey
quelle