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;
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;
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;
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.
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));
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
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