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对象,没问题.