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 }
对于处理将多个过滤器应用于一组值的大多数情况,这是一个优雅的解决方案。
我想创建一个具有三个条件的表达式
但是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 }
对于处理将多个过滤器应用于一组值的大多数情况,这是一个优雅的解决方案。