91 votes

LINQ Group By et collection de sélection

J'ai cette structure

Customer
 - has many Orders
  - has many OrderItems

Je veux générer une liste de CustomerItems via LINQ, étant donné un sous-ensemble de OrderItems :

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

qui est un regroupement de tous les articles qu'un client a commandés à partir du sous-ensemble d'articles

Comment puis-je utiliser LINQ pour remonter la commande et la regrouper par Client pour générer cet objet ?

Pour l'instant, je suis sur quelque chose comme

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

Mais ce n'est évidemment pas une liste. Je suppose que j'ai besoin d'un SelectMany quelque part, mais j'aurais besoin de quelques conseils.

165voto

Ani Points 59747

Je pense que vous voulez :

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

Si vous voulez continuer à utiliser la surcharge de GroupBy que vous utilisez actuellement, vous pouvez le faire :

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

...mais personnellement je trouve cela moins clair.

6voto

caras Points 408

Vous pouvez également aimer ceci

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

5voto

cimey Points 175

Vous pouvez y arriver avec la jointure de groupe

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 est le client et g est le poste de commande du client.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X