プログラムで式ツリーを作成しようとしています。
入力には、次の形式の条件クラスのリストがあります。
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;
}
条件が1つしかない場合はすべて機能しますが、静的メソッドの1つを使用して式を結合しようとすると、And
次のようOr
にAndAlso
なります。OrElse
InvalidOperationException
二項演算子Orは、タイプ'System.Func
2[MyObject,System.Boolean]' and 'System.Func
2 [MyObject、System.Boolean]'に対して定義されていません。
少し混乱しています。誰かが例外の理由をよりよく説明し、解決策を提案できますか?
どうもありがとう!