Linq выбирает объекты в списке, где существует IN (A, B, C)
У меня есть список orders
.
Я хочу выбирать orders
на основе набора статусов заказов.
Таким образом, по существу 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;
Ответы
Ответ 1
Ваши статусные коды также являются коллекцией, поэтому используйте Contains
:
var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
или в синтаксисе запроса:
var filteredOrders = from order in orders.Order
where allowedStatus.Contains(order.StatusCode)
select order;
Ответ 2
var statuses = new[] { "A", "B", "C" };
var filteredOrders = from order in orders.Order
where statuses.Contains(order.StatusCode)
select order;
Ответ 3
NB: это LINQ для объектов, я не уверен на 100%, если он работает в LINQ для сущностей и не имеет времени проверить его прямо сейчас. На самом деле не сложно перевести его на x в [A, B, C], но вы должны проверить сами.
Итак, вместо Содержит как замену ???? в коде, вы можете использовать Любые, что больше 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;
Это противоположно тому, что вы знаете из SQL, поэтому это не так очевидно.
Конечно, если вы предпочитаете свободный синтаксис здесь:
var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode));
Здесь мы снова видим один из сюрпризов LINQ (например, Joda-speech, который ставит выбор в конце). Однако в этом смысле вполне логично, что он проверяет, соответствует ли хотя бы один из элементов (любой) в списке (набор, коллекция) одно значение.
Ответ 4
Попробуйте Contains
функцию;
Определяет, содержит ли последовательность указанный элемент.
var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
Ответ 5
Только будьте осторожны, .Contains()
будет соответствовать любой подстроке, включая строку, которую вы не ожидаете. Например, new[] { "A", "B", "AA" }.Contains("A")
вернет вам как A, так и AA, которые вам могут не понадобиться. Я был укушен этим.
.Any()
или .Exists()
более безопасный выбор