LINQ选择在存在于列表对象(A,B,C)

问题描述 投票:139回答:5

我有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;
c# linq list linq-to-objects exists
5个回答
245
投票

您的状态码也是一个集合,所以使用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;

14
投票
var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;

11
投票

试着用Contains功能;

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

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));

11
投票

注:这是LINQ的对象,我不是100%肯定,如果它在LINQ工作实体,并没有时间,现在去检查一下。其实,这是不是太困难把它翻译在[A,B,C] X,但你必须检查自己。

因此,而不是包含作为替换的????在你的代码,你可以使用任何哪个更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惊喜(如乔达语音这在年底把选择)之一。然而正是在这个意义上相当合乎逻辑的,它会检查项目中的至少一个(即有)的列表(组,集合)匹配单个值。


-2
投票

只是要小心,.Contains()将匹配任何字符串包括你不要指望字符串。对于如。 new[] { "A", "B", "AA" }.Contains("A")将返回A和您可能不想AA。我已经被它咬伤。

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

© www.soinside.com 2019 - 2024. All rights reserved.