198

我有一个清单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;
4

5 回答 5

343

您的状态代码也是一个集合,因此请使用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;
于 2013-01-10T11:55:06.150 回答
19
var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;
于 2013-01-10T11:55:21.273 回答
18

尝试Contains功能;

确定序列是否包含指定元素。

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
于 2013-01-10T11:56:05.283 回答
18

注意:这是 LINQ to objects,我不是 100% 确定它是否适用于 LINQ to entity,现在没有时间检查它。事实上,将它翻译成[A, B, C] 中的 x并不难,但你必须自己检查。

所以,而不是包含作为???? 在您的代码中,您可以使用更 LINQ-uish 的 Any

// 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 将 select 放在最后)。然而,从这个意义上说,它检查列表(集合、集合)中的至少一个项目(即any)是否与单个值匹配是非常合乎逻辑的。

于 2015-07-26T15:58:51.487 回答
-3

请注意,.Contains()将匹配任何子字符串,包括您不期望的字符串。例如。new[] { "A", "B", "AA" }.Contains("A")将返回您可能不想要的 A 和 AA。我已经被它咬了。

.Any()或者.Exists()是更安全的选择

于 2018-06-19T00:19:22.820 回答