我正在尝试以编程方式构建表达式树。
我的输入中有一个条件类列表,其格式如下:
public class Filter
{
public string field { get; set; }
public string operator { get; set; }
public string value { get; set; }
}
当我构建对象时,我通过以下方式为每个条件Expression
创建一个Expression
foreach ( Filter sf in rules ) {
Expression ex = sf.ToExpression( query );
if ( mainExpression == null ) {
mainExpression = ex;
}
else {
if ( logicalCondition == "AND" ) {
mainExpression = Expression.And( mainExpression, ex );
}
else if ( logicalCondition == "OR" ) {
mainExpression = Expression.Or( mainExpression, ex );
}
}
}
Filter.ToExpression() 方法是这样实现的
public override Expression ToExpression( IQueryable query ) {
ParameterExpression parameter = Expression.Parameter( query.ElementType, "p" );
MemberExpression memberAccess = null;
foreach ( var property in field.Split( '.' ) )
memberAccess = MemberExpression.Property( memberAccess ?? ( parameter as Expression ), property );
ConstantExpression filter = Expression.Constant( Convert.ChangeType( value, memberAccess.Type ) );
WhereOperation condition = (WhereOperation)StringEnum.Parse( typeof( WhereOperation ), operator );
LambdaExpression lambda = BuildLambdaExpression( memberAccess, filter, parameter, condition, value );
return lambda;
}
当我有一个条件时一切正常,但是当我尝试使用And
, Or
, AndAlso
,OrElse
静态方法之一组合表达式时,我收到一个InvalidOperationException
说:
2[MyObject,System.Boolean]' and 'System.Func
没有为类型“System.Func 2[MyObject,System.Boolean]”定义二元运算符 Or 。
我有点困惑。有人可以更好地解释异常的原因并提出解决方案吗?
非常感谢!