Я пытаюсь построить дерево выражений программно.
У меня на входе есть список классов условий, которые имеют следующую форму:
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
, который говорит:
двоичный оператор Or не определен для типов 'System.Func 2[MyObject,System.Boolean]' and
'System.Func
2 [MyObject, System.Boolean]'.
Я немного запутался.Может кто-нибудь лучше объяснить причины исключения и предложить решение?
Большое спасибо!