Expression.And三个条件

Expression.And three conditions

我想创建一个具有三个条件的表达式

但是Linq.Expressions.Expression.And只能接受两个表达式。

我想要:Expression1 AND Expression2 AND Expression3

Linq.Expressions 中是否有直接的方法来做到这一点?

使用And两次

即(伪代码),

And(condition1,And(condition1,condition2))

你必须combine/nest他们:

Expression.And(
  Expression.And(
    ...,
    ...
  ),
  ...
);

在C#中,&是二元运算符,表达式tress镜像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)中检查生成的程序集。请确保关闭任何将表达式树解析回代码的优化。

提供的答案确实解决了这个问题,但我觉得更好的问题是:我如何应用 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 }

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