Подтвердить что ты не робот

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;
4b9b3361

Ответ 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() более безопасный выбор