2013-01-10 8 views
108

Mam listę orders.
Chcę wybrać orders na podstawie zestawu stanów zamówień.Linq wybierz obiekty na liście, gdzie istnieje IN (A, B, C)

Więc zasadniczo 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; 

Dziękujemy.

+0

użycie Zawiera funkcję – Zaki

+0

Dziękuję wszystkim, którzy odpowiedzieli tak szybko. Esp dla rozwiązania lambda. Jeszcze nie zrobiłem nic z wyrażeniami lambda. Zakładam, że zrobiłbym NOT zawiera używając (o =>! (Status.Contains (o.OrderHeaderOrderStatusCode))) – MartinS

Odpowiedz

187

swój status kody są także zbiór, więc używaj Contains:

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

lub w składni zapytania:

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

spróbuj Contains funkcji;

Określa, czy sekwencja zawiera określony element.

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

UWAGA: jest LINQ do obiektów, nie jestem 100% pewien, czy to działa w LINQ do podmiotów, a nie mają czasu, aby sprawdzić go teraz. W rzeczywistości nie jest trudno przetłumaczyć go na x w [A, B, C], ale musisz sprawdzić sam.

Tak więc zamiast zawiera jako zamiennik ???? w kodzie można użyć Wszelkie który jest bardziej 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; 

Jest to przeciwieństwo tego, co wiemy z SQL to dlaczego nie jest to takie oczywiste.

Oczywiście, jeśli wolisz składnię płynnie tutaj jest:

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

Tu znów widzimy jedną z niespodzianek LINQ (jak Joda-mowy, która stawia wybierz na końcu). Jest to jednak logiczne w tym sensie, że sprawdza, czy co najmniej jeden z elementów (czyli dowolna) na liście (zestaw, kolekcja) pasuje do pojedynczej wartości.

Powiązane problemy