我有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;
答案 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()
是更安全的选择