我有一个名为OrderStatus
,它包含订单可以处于的各种状态:
- Created
- Pending
- Waiting
- Valid
- Active
- 处理
- 完全的
我想要做的是创建一个 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)
这确实有效,但是非常“啰嗦”。有没有办法将其转换为Contains()
声明并缩短一点?
Sure:
var status in Order.Status.Where(status => new [] {
OrderStatus.Valid,
OrderStatus.Active,
OrderStatus.Processed,
OrderStatus.Completed
}.Contains(status.OrderStatus));
您还可以定义一个扩展方法In()
它将接受一个对象和一个 params 数组,并且基本上包装了 Contains 函数:
public static bool In<T>(this T theObject, params T[] collection)
{
return collection.Contains(theObject);
}
这允许您以更类似于 SQL 的方式指定条件:
var status in Order.Status.Where(status =>
status.OrderCode.In(
OrderStatus.Valid,
OrderStatus.Active,
OrderStatus.Processed,
OrderStatus.Completed));
了解并非所有 Linq 提供程序都喜欢在其 lambda 中自定义扩展方法。例如,NHibernate 在没有额外编码来扩展表达式解析器的情况下无法正确转换 In() 函数,但 Contains() 工作得很好。对于 Linq 2 对象,没有问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)