主要内容摘自:https://stackoverflow.com/questions/6736505/how-to-combine-two-lambdas/6736589#6736589
假设我们的集合有两个动态条件:
Expression<Func<string, bool>> expr1 = s => s.Length == 5;
Expression<Func<string, bool>> expr2 = s => s == "someString";
我想动态组合这些条件比如取它们的OR关系。
就像这样:
Expression.Or(expr1, expr2)
或者像这样使用:
expr1 || expr2
但是我不能写成一个这样的表达式
Expression<Func<string, bool>> expr = s => s.Length == 5 || s == "someString"
那有什么解决方案呢?
请看如下回答的代码:
internal class ParameterReplacer : ExpressionVisitor {
private readonly ParameterExpression _parameter;
protected override Expression VisitParameter(ParameterExpression node) {
return base.VisitParameter(_parameter);
}
internal ParameterReplacer(ParameterExpression parameter) {
_parameter = parameter;
}
}
class Program {
static void Main(string[] args) {
Expression<Func<string, bool>> expr1 = s => s.Length == 5;
Expression<Func<string, bool>> expr2 = s => s == "someString";
var paramExpr = Expression.Parameter(typeof(string));
var exprBody = Expression.Or(expr1.Body, expr2.Body);
exprBody = (BinaryExpression) new ParameterReplacer(paramExpr).Visit(exprBody);
var finalExpr = Expression.Lambda<Func<string, bool>>(exprBody, paramExpr);
}
}
ExpressionVisitor是在 .NET 4以后添加的新类。看到这里应该都懂了吧。