표현식 방문자가 p => p.SubRelatedEntities.FirstOrDefault(sre => sre.SomeFlag==true).SomePropertyWithRelatedEntity
과 같이 (단순화 된) Utility.GetString(MyEntity.SomePropertyWithRelatedEntity)=="abc"
과 같은 함수 호출을 대체하려고합니다.즉시 엔티티 프레임 워크에서 대체 된 표현식 노드의 매개 변수를 바인딩하는 방법
의 데이터 모델과 같은 간다 : MyEntity -> RelatedEntity -> SubRelatedEntity
나는 RelatedEntity
에서 몇 가지 규칙에 따라 SubRelatedEntity
에서 문자열 값을 반환하기 위해 노력하고있어, 내가하지 모든 사용법에서 전체 필터링 규칙을 다시 작성/복사/붙여 넣기해야합니다. 그게 내 "호출 서명"을 넣는 이유입니다. 그래서 표현의 방문자가 그것을 식별하고 가짜 호출을 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
(예 : 관련된 엔티티로 채워진 속성)이 있습니다.
내 문제가 이해되기를 바랍니다. 통찰력을 가져 주셔서 감사합니다!
감사 안드레이 - 많은 감사 – Basic