質問: {tag=>((tag.id=2)||(tag.id=3))} && {tag=>((tag.uid="MU")||(tag.uid="ST"))} ``` LINQのwhere句に渡すことができるようなものです。 **Expression.And(leftexp、rightexp)**を使用しようとし**ましたが、** しかし、エラーを持って.. > バイナリ演算子Andは型に対して定義されていません > 'System.Func `2[WebApplication1.View_MyView,System.Boolean]' and 'System.Func` 2 [WebApplication1.View_MyView、System.Boolean]'。 > > 表現は私にとっては新しいものであり、あまりに多くのコードを見ているかもしれないので、これをやり遂げる方法をちょっと混乱させました。正しい方向に向けることができれば本当に感謝します。
回答: 両方の完全な表現木を完全な新しいものに書き換えることなく、それを行うことはできません。 理由:パラメータ式オブジェクトは、式ツリー全体で同じでなければなりません。 2つを結合すると、同じパラメーターに対して2つのパラメーター式オブジェクトがありますが、これは機能しません。 次のコードで表示されます。 ``` Expression> leftexp = tag => ((tag.id == 2) || (tag.id == 3)); Expression> rightexp = tag => ((tag.uid == "MU") || (tag.uid == "ST")); Expression binaryexp = Expression.AndAlso(leftexp.Body, rightexp.Body); ParameterExpression[] parameters = new ParameterExpression[1] { Expression.Parameter(typeof(Tab), leftexp.Parameters.First().Name) }; Expression> lambdaExp = Expression.Lambda>(binaryexp, parameters); var lambda = lambdaExp.Compile(); ``` これは、lambdaExp.Compile()呼び出しで失敗し、次の例外が発生します。 ``` Lambda Parameter not in scope ``` これは、基本的に私はleftexpとrightexp式を再利用していますが、 `Expression.Lambda>(...)`には私から与えられていない、両方とも異なるパラメータ式があり`Expression.Lambda>(...)`コール。 leftexpとrightexpには、 `Expression.Lambda>(...)`呼び出しに与えられたものと一致しなければならないパラメータ式オブジェクトがあります。 これを解決するには、パラメータタグに新しい(単一の)パラメータ式を使用して完全な式を再作成します。 この問題の詳細については、 ここを参照してください。