2013-01-10 8 views
108

Ho una lista di orders.
Desidero selezionare orders in base a un insieme di stati di ordine.Linq seleziona gli oggetti nell'elenco in cui esiste IN (A, B, C)

Quindi, in sostanza select orders where order.StatusCode in ("A", "B", "C")

// Filter the orders based on the order status 
var filteredOrders = from order in orders.Order 
        where order.StatusCode.????????("A", "B", "C") 
        select order; 

Molte grazie.

+0

uso Contiene la funzione – Zaki

+0

Grazie a tutto ciò che ha risposto così rapidamente. Esp per la soluzione lambda. Non ho ancora fatto nulla con le espressioni lambda. Presumo che farei un NOT contenente usando (o =>! (Statuses.Contains (o.OrderHeaderOrderStatusCode)))) – MartinS

risposta

187

Il tuo status-codici sono anche una raccolta, in modo da utilizzare Contains:

var allowedStatus = new[]{ "A", "B", "C" }; 
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode)); 

o in sintassi di query:

var filteredOrders = from order in orders.Order 
        where allowedStatus.Contains(order.StatusCode) 
        select order; 
11
var statuses = new[] { "A", "B", "C" }; 

var filteredOrders = from order in orders.Order 
          where statuses.Contains(order.StatusCode) 
          select order; 
8

Prova con Contains funzione;

Determina se una sequenza contiene un elemento specificato.

var allowedStatus = new[]{ "A", "B", "C" }; 
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode)); 
7

NB: questo è LINQ to Objects, io non sono sicuro al 100% se lavorare in LINQ to entità, e non hanno tempo di controllare subito. In realtà non è troppo difficile tradurlo in x in [A, B, C] ma devi controllare tu stesso.

Quindi, invece di Contiene in sostituzione del ???? nel codice è possibile utilizzare Qualsiasi che è più LINQ-uish:

// Filter the orders based on the order status 
var filteredOrders = from order in orders.Order 
        where new[] { "A", "B", "C" }.Any(s => s == order.StatusCode) 
        select order; 

E 'l'opposto di ciò che si sa da SQL questo è il motivo per cui non è così ovvio.

Naturalmente, se si preferisce la sintassi fluente qui è:

var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode)); 

Qui vediamo di nuovo una delle sorprese LINQ (come Joda-speech che mette selezionare alla fine). Tuttavia è abbastanza logico in questo senso che controlli se almeno uno degli elementi (ovvero qualsiasi) in un elenco (set, raccolta) corrisponda a un singolo valore.

Problemi correlati