我有一份订单清单。 我想根据一组订单状态选择订单。

本质上就是选择顺序。StatusCode在(“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;

当前回答

Try with Contains功能;

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

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

其他回答

你的状态代码也是一个集合,所以使用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;
var statuses = new[] { "A", "B", "C" };

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

只是要小心,. contains()将匹配任何子字符串,包括您不期望的字符串。如。new[] {"A", "B", "AA"}. contains ("A")将返回你可能不想要的A和AA。我被它咬了一口。

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

Try with Contains功能;

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

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

注:这是对象的LINQ,我不是100%确定它是否适用于实体的LINQ,现在没有时间检查它。事实上,把它转换成[A, B, C]中的x并不太难,但你必须自己检查。

因此,取代Contains作为????的替代品在你的代码中,你可以使用更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,它把选择放在最后)。然而,从这个意义上说,它检查列表(set, collection)中是否至少有一个项(即any)与单个值匹配是非常合乎逻辑的。