2012-05-17 29 views
36

que tienen esta estructuraLINQ Agrupar por y selecta colección

Customer 
- has many Orders 
    - has many OrderItems 

Quiero generar una lista de CustomerItems a través de LINQ dado un subconjunto de OrderItems:

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

que es una agrupación de toda la elementos que un Cliente ha pedido al subconjunto de artículos

¿Cómo puedo usar LINQ para hacer un seguimiento retroactivo a través del pedido y agrupar por Cliente para generar este objeto?

hasta ahora estoy en algo como

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

Pero eso es, obviamente, no una lista. Supongo que necesito un SelectMany en algún lado, pero podría hacerlo con algunos punteros.

Respuesta

69

Creo que desee:

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

Si desea seguir utilizando la sobrecarga de GroupBy que está utilizando actualmente, que puede hacer:

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

... pero yo personalmente considero que menos claro.

+0

qué necesita el() llamada ToList en el grupo? ¿No sería suficiente la última ToList()? –

+0

@Ani - Sí, tendría que aceptar –

+2

@Joanna: De acuerdo con los requisitos del OP, la propiedad 'Items' del tipo anónimo debe ser una lista. – Ani

2

puede achive con unirse a grupo

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 es Cliente y g es la orden de clientes artículos.

3

que también le gusten este

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

¿Por qué? obtener 'item.Field <>' y no '.Order' por ejemplo? Estoy usando una DataTable. – Si8