我想创建一个包含三个条件的表达式
但Linq.Expressions.Expression.And只能采用两个表达式。
我想:Expression1 AND Expression2 AND Expression3
Linq.Expressions中是否有直接方法来执行此操作?
答案 0 :(得分:1)
你必须组合/嵌套它们:
Expression.And(
Expression.And(
...,
...
),
...
);
答案 1 :(得分:1)
在C#中,&
是二元运算符,表达式是镜像C#。
因此,左#关联的C#表达式a & b & c
实际上意味着(a & b) & c
,并使用表达式树:
Expresssion.And(Expression.And(a, b), c)
请注意,如果您打算为&&
运算符创建一个表达式树,它也会进行短路,那么您应该使用AndAlso
。
附注:学习如何构建表达式树的最简单方法是使用C#编译器本身。例如,只需编译这段代码:
Expression<Func<bool>> e = () => a & b & c;
在反编译工具(例如ILSpy)中检查生成的程序集。请务必关闭将表达式树解析回代码的任何优化。
答案 2 :(得分:0)
两次使用And
即(伪代码),
And(condition1,And(condition1,condition2))
答案 3 :(得分:-1)
提供的答案确实解决了这个问题,但我觉得更好的问题是:如何应用 n 条件?
您可以使用Aggregate
方法执行此操作,该方法可以将一组条件应用于数据集。例如:
//values to filter
var values = new int[] { 1, 10, 46, 51, 58, 92, 105, 110 }.AsQueryable();
var filters = new Expression<Func<int, bool>>[] {
i => i % 2 == 0, // integer is even
i => i > 50, // integer is greater than 50
i => i < 100 // integer is less than 100
};
var result = filters.Aggregate(values, (current, expression) => current.Where(expression));
//result is { 58, 92 }
这是处理将多个过滤器应用于一组值的大多数情况的优雅解决方案。