2012-05-17 12 views
36

Ich habe diese StrukturLINQ Gruppierung und wählen Sie Sammlung

Customer 
- has many Orders 
    - has many OrderItems 

ich eine Liste von CustomerItems über LINQ gegeben eine Teilmenge von OrderItems generieren möchten:

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

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

Wie kann ich LINQ verwenden, um die Bestellung zurückzuverfolgen und nach Kundengruppe zu gruppieren, um dieses Objekt zu generieren?

so weit bin ich auf so etwas wie

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

Aber das ist natürlich nicht eine Liste. Ich nehme an, ich brauche irgendwo eine SelectMany, könnte aber mit ein paar Zeigern anfangen.

Antwort

69

Ich glaube, Sie wollen:

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

Wenn Sie die Überlastung von GroupBy fortsetzen möchten Sie derzeit verwenden, können Sie tun:

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

... aber ich persönlich finde, dass weniger klar.

+0

tun müssen Sie die ToList() -Aufruf auf der Gruppe? Wäre die letzte ToList() nicht genug? –

+0

@Ani - Ja, ich würde zustimmen müssen –

+2

@Joanna: Gemäß den Anforderungen des OP muss die Eigenschaft 'Items' des anonymen Typs eine Liste sein. – Ani

2

Sie es mit Gruppe achive kann mitmachen

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 Kunde ist und g ist die Kunden Produkte bestellen.

3

Sie können auch mögen dieses

var Grp = Model.GroupBy(item => item.Order.Customer) 
     .Select(group => new 
     { 
      Customer = Model.First().Customer, 
      CustomerId= group.Key, 
      Orders= group.ToList() 
     }) 
     .ToList(); 
+0

Warum ist es ich Holen Sie 'item.Field <>' und nicht '.Order' zum Beispiel? Ich verwende eine DataTable. – Si8