Utility.GetString(MyEntity.SomePropertyWithRelatedEntity)=="abc"
(単純化された) のような関数呼び出しを式のビジターに置き換えようとしていますp => p.SubRelatedEntities.FirstOrDefault(sre => sre.SomeFlag==true).SomePropertyWithRelatedEntity
。
つまり、データモデルは次のようになります: MyEntity -> RelatedEntity -> SubRelatedEntity
SubRelatedEntity
のいくつかのルールに基づいて、から文字列値を返そうとしているRelatedEntity
ので、使用するたびにフィルタリング ルール全体を書き直したり、コピーしたり、貼り付けたりする必要はありません。そのため、「呼び出し署名」を入れて、式のビジターがそれを識別し、偽の呼び出しをUtility.GetString
いくつかの複雑なラムダ式に置き換えることができるようにします。
私の式ビジターには次のようなものが含まれています:
public override Expression Visit(Expression node)
{
if (node == null)
return null;
Expression result = null;
if (node.NodeType == ExpressionType.Call)
{
MethodCallExpression mce = node as MethodCallExpression;
if (mce.Method.DeclaringType == typeof(Utility) && mce.Method.Name == "GetString")
{
Expression<Func<RelatedEntity, string>> exp = re => re.SubRelatedEntities.FirstOrDefault(sre => sre.SomeFlag == true).SomeStringValue;
result = exp.Body;
}
else
result = base.Visit(node);
}
else
result = base.Visit(node);
return result;
}
ここでの問題は、注入されたラムダ式が呼び出されたときに「sre」パラメーターがバインドされていないことです。多くの調査の結果、ラムダ パラメータを別の式ビジターに置き換える必要があることがわかりました。具体的には、新しいパラメータを検索して古いパラメータに置き換えます。ただし、私の状況では、「古いパラメーター」はありませんMyEntity.SomePropertyWithRelatedEntity
。生成されたラムダに何らかの方法で挿入する必要がある式 (関連するエンティティで満たされたプロパティなど) があります。
私の問題が理解できることを願っています。洞察をありがとう!