表达。和三个条件

时间:2016-06-15 08:44:34

标签: c# linq-expressions

我想创建一个包含三个条件的表达式

但Linq.Expressions.Expression.And只能采用两个表达式。

我想:Expression1 AND Expression2 AND Expression3

Linq.Expressions中是否有直接方法来执行此操作?

4 个答案:

答案 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 }

这是处理将多个过滤器应用于一组值的大多数情况的优雅解决方案。