2011-12-19 24 views
6

Estoy buscando una buena consulta LINQ simple que pueda obtener un elemento que se encuentre en una colección de una colección. Considere los siguientes modelos ...LINQ: Búsqueda de una colección dentro de una colección para un solo objeto

class Customer 
{ 
    List<Order> Orders; 
    int ID; 
} 

class Order 
{ 
    int ID; 
} 

Digamos que tengo una lista de tipo de cliente ...

List<Customer> Customers; 

Lo que yo quiero es una sola ordenbasado en el ID de la Orden (esta es mi información de entrada conocida). También puedo suponer que un pedido es único para un cliente (por lo que solo habrá un pedido con el ID que busco entre todos los clientes)

¿Hay alguna buena consulta LINQ que pueda usar para obtener el pedido? ¿Busco?

Sé que puedo hacer esto fácilmente en una sola lista de Pedidos, pero esta es la configuración con la que tengo que trabajar. No quiero pedir más información, si ya tengo suficiente en la memoria para obtener lo que necesito.

Podría hacer esto con un bucle for semi-desordenado. Tal vez debería hacer esto? Tal vez estoy tratando de simplificar el código demasiado?

Respuesta

13

Vaya, interpretan mal la pregunta:

var matchingOrders = from customer in customers 
        from order in customer.Orders 
        where order.ID == orderID 
        select order; 

var order = matchingOrders.Single(); 

Al igual que en una versión anterior de esta respuesta, tenga en cuenta que esto va a fallar si no hay tales partidos o más de uno. También puede consultar SingleOrDefault, First y FirstOrDefault.

Este código también se puede escribir sin expresiones de consulta utilizando SelectMany:

var order = customers.SelectMany(customer => customer.Orders) 
        .Single(order => order.ID == orderID); 

Tenga en cuenta que no lo hace necesidad de utilizar Where y luego Single - hay una sobrecarga de Single teniendo un predicado (y lo mismo para FirstOrDefault etc.). Si usted usa el formulario de expresión de consulta o no depende de usted - I generalmente utiliza expresiones de consulta en lugar de SelectMany, pero en este caso no necesita el cliente, por lo que puede usar la sobrecarga simple de SelectMany.

+0

Esto no responde a mi pregunta. Quiero un artículo de pedido que no sea un cliente. Ya es bastante malo que no lean mi pregunta correctamente, ¿pero 4 votantes no lo lean también? no es un buen día – musefan

+0

@musefan: Vaya, leí mal - eche un vistazo ahora. –

+1

buena recuperación;) 'SelectMany' es lo que estaba buscando, no me di cuenta de que existía. Me da una colección concatenada para trabajar, así que me gusta eso. No soy fan de las expresiones de consulta, no me parece suficiente código – musefan

2

aquí 2 es identificación de la orden

var selectedOrder = customers.SelectMany(cc => cc.Orders.Where(cc1 => cc1.ID == 2)).FirstOrDefault(); 
Cuestiones relacionadas