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.

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.


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();

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.