如何使用LINQ Contains()查找枚举列表?

Tod*_*vis 9 .net c# linq contains

我有一个名为enum的枚举OrderStatus,它包含一个Order可以包含的各种状态:

  • 创建
  • 有待
  • 等候
  • 有效
  • 活性
  • 处理
  • 已完成

我想要做的是创建一个LINQ语句,告诉我OrderStaus是有效,活动,已处理或已完成.

现在我有类似的东西:

var status in Order.Status.WHERE(status => 
      status.OrderStatus == OrderStatus.Valid || 
      status.OrderStatus == OrderStatus.Active|| 
      status.OrderStatus == OrderStatus.Processed|| 
      status.OrderStatus == OrderStatus.Completed)
Run Code Online (Sandbox Code Playgroud)

这有效,但它非常"罗嗦".有没有办法将此转换为Contains()语句并将其缩短一点?

Kei*_*thS 16

当然:

var status in Order.Status.Where(status => new [] {
        OrderStatus.Valid, 
        OrderStatus.Active, 
        OrderStatus.Processed,
        OrderStatus.Completed
    }.Contains(status.OrderStatus));
Run Code Online (Sandbox Code Playgroud)

您还可以定义一个In()接受对象和params数组的扩展方法,并基本上包装Contains函数:

public static bool In<T>(this T theObject, params T[] collection)
{
    return collection.Contains(theObject);
}
Run Code Online (Sandbox Code Playgroud)

这允许您以更多SQL-ish方式指定条件:

var status in Order.Status.Where(status => 
    status.OrderCode.In(
        OrderStatus.Valid, 
        OrderStatus.Active, 
        OrderStatus.Processed,
        OrderStatus.Completed));
Run Code Online (Sandbox Code Playgroud)

了解并非所有Linq提供商都喜欢他们的lambda中的自定义扩展方法.例如,NHibernate将无法正确转换In()函数而无需额外编码来扩展表达式解析器,但Contains()可以正常工作.对于Linq 2对象,没问题.