Linq选择列表中存在的对象IN(A,B,C)

时间:2013-01-10 11:53:33

标签: c# linq list linq-to-objects exists

我有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;

5 个答案:

答案 0 :(得分:233)

您的状态代码也是一个集合,因此请使用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;

答案 1 :(得分:13)

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

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

答案 2 :(得分:11)

尝试使用Contains功能;

  

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

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

答案 3 :(得分:10)

NB:这是对象的LINQ,我不是100%确定它是否在LINQ实体中工作,并且没有时间立即检查它。事实上,将它转换为[A,B,C] 中的 x并不困难,但你必须亲自检查。

因此,代替包含代替代码中的 ???? ,您可以使用 Any 更多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 :(得分:-2)

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

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