2011-12-19 14 views
6

Sto cercando una semplice query LINQ semplice che possa ottenere un elemento che si trova in una raccolta di una raccolta. Prendere in considerazione i seguenti modelli di ...LINQ: ricerca di una raccolta all'interno di una raccolta per un singolo oggetto

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

class Order 
{ 
    int ID; 
} 

Diciamo che ho una lista di tipo di cliente ...

List<Customer> Customers; 

Quello che voglio è una unico Ordine in base all'ID del Ordine (questo è il mio dato di input noto). Posso anche presumere che un Ordine sia univoco per un cliente (quindi ci sarà un solo Ordine con ID che cerco tra tutti i clienti)

C'è una bella query LINQ che posso usare per ottenere l'Ordine Sto cercando?

So che posso facilmente farlo su una singola lista di ordini, ma questa è la configurazione con cui devo lavorare. Non voglio interrogare per più dati, ho già abbastanza memoria per ottenere ciò di cui ho bisogno.

Potrei farlo con un ciclo semi-disordinato. Forse dovrei farlo? Forse sto cercando di semplificare troppo il codice?

risposta

13

Ops, letto male la domanda:

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

var order = matchingOrders.Single(); 

Come in una versione precedente di questa risposta, si noti che questa avrà esito negativo se non ci sono queste partite o più di uno. Si consiglia inoltre di guardare SingleOrDefault, First e FirstOrDefault.

Questo codice può anche essere scritta senza espressioni di query utilizzando SelectMany:

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

Nota che non si bisogno di usare Where e poi Single - c'è un Single sovraccarico di prendere un predicato (e allo stesso modo per FirstOrDefault ecc.). Se si utilizza il modulo di espressione della query o meno, I di solito utilizza le espressioni di query anziché SelectMany, ma in questo caso non è necessario il cliente, quindi è possibile utilizzare il semplice sovraccarico di SelectMany.

+0

Questo non risponde alla mia domanda. Voglio un articolo dell'ordine non un cliente. Abbastanza male non stai leggendo la mia domanda correttamente, ma 4 up-elettori non leggerlo anche tu? non una buona giornata – musefan

+0

@musefan: Whoops, frainteso - dai un'occhiata ora. –

+1

buona ripresa;) 'SelectMany' è quello che stavo cercando, non mi rendevo conto che esisteva. Mi dà una collezione concatenata con cui lavorare così mi piace. Non è un fan delle espressioni di query me stesso - non mi sembra abbastanza codice per me – musefan

2

qui 2 è ID ordine

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