Linq select objects in list where exists in (A, B, C)

Mam listę orders.
Chcę wybrać orders na podstawie zestawu statusów zamówień.

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;
Author: Tot Zam, 2013-01-10

5 answers

Twoje kody statusu są również zbiorem, więc użyj 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;
 306
Author: Tim Schmelter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-10 12:20:02
var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;
 17
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-10 11:55:21

Uwaga: to jest LINQ to objects, nie jestem w 100% pewien, czy to działa w LINQ to entities, i nie mam czasu, aby to teraz sprawdzić. W rzeczywistości nie jest to zbyt trudne do przetłumaczenia na x W [A, B, C] , ale musisz sprawdzić sam.

Więc zamiast zawiera jako zamiennik ???? w Twoim kodzie możesz użyć dowolnego , 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 przeciwieństwem tego, co wiesz z SQL, dlatego nie jest tak to oczywiste.

Oczywiście, jeśli wolisz płynną składnię, to jest to:

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

Tutaj znowu widzimy jedną z niespodzianek LINQ (jak Joda-speech, który umieszcza select na końcu). Jest to jednak dość logiczne w tym sensie, że sprawdza, czy przynajmniej jeden z elementów (tj. dowolny) na liście (zbiór, kolekcja) pasuje do pojedynczej wartości.

 15
Author: Alexander Christov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-26 16:03:53

Spróbuj z Contains function;

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

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
 14
Author: Soner Gönül,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-10 11:56:05

Bądź ostrożny, .Contains() dopasuje dowolny podłańcuch włącznie z łańcuchem znaków, którego się nie spodziewasz. Dla np. Zwróci ci zarówno A, jak i AA, których możesz nie chcieć. Zostałem przez nią ugryziony.

.Any() or .Exists() is safer choice

 -3
Author: Balvinder Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-19 00:45:38