【发布时间】:2018-02-12 23:48:09
【问题描述】:
我有一个类型的表达式列表:Expression<Func<Person, bool>>,我想聚合它们,然后将聚合结果编译成单个 Func<Person, bool>。我能够创建聚合表达式,但编译结果聚合表达式的部分会引发异常。任何帮助,将不胜感激。谢谢。
Expression<Func<Person, bool>> expr1 = x => x.Age > 10;
Expression<Func<Person, bool>> expr2 = x => x.LastName == "some firstname";
Expression<Func<Person, bool>> expr3 = x => x.FirstName == "some lastname";
Expression<Func<Person, bool>> expr4 = x => x.Initial == 'a';
Expression<Func<Person, bool>> expr5 = x => x.DateOfBirth == DateTime.Now;
Expression<Func<Person, bool>> expr6 = x => x.Height > 10;
var exprList = new List<Expression<Func<Person, bool>>>()
{
expr1, expr2, expr3, expr4, expr5
};
var list = exprList
.Select(x => x.Body)
.Aggregate(Expression.AndAlso);
// this works, apparently?!
var aggregatedExpression = Expression.Lambda<Func<Person, bool>>(list, Expression.Parameter(typeof(Person), "x"));
// fails here! it cannot compile
var result = aggregatedExpression.Compile();
这是个例外:
未处理的异常:System.InvalidOperationException:从范围“”引用的“TestAggregateExpression.Person”类型的变量“x”,但未定义
在 System.Linq.Expressions.Compiler.VariableBinder.Reference(ParameterExpression 节点,VariableStorageKind 存储)
【问题讨论】:
标签: c# linq expression-trees