2012-03-10 2 views
0

나는 viewmodel (memberviewmodel)과 ef model (멤버)을 가지고 있습니다. 내가 어떻게transpose 또는 translate Expression Linq

> GetByProperty(Expression<Func<Member, bool>> whereCondition) 

어떤 아이디어가

> GetByProperty(Expression<Func<MemberViewModel, bool>> whereCondition) 

에서 번역합니까?

내 서비스는 GetByProperty (Expression> whereCondition) 메서드를 노출하지만 GetByProperty (Expression> whereCondition) 메서드를 노출하는 비즈니스 개체를 호출합니다.

+0

당신이 번역 무엇을 의미합니까? getsingle 한테 전화하고 싶니? –

+0

어떻게 그 두 가지 방법으로 의사 소통을합니까? whereCondition을 두 번째 메서드로 전달하는 것만으로는 사용할 수 없습니까? – user384080

답변

1

Expression<Func<MemberViewModel, bool>>Expression<Func<Member, bool>>으로 변환하려면 ExpressionVisitor 클래스를 확장해야합니다. MemberViewModel에는 필드와 속성 만 있다고 가정했습니다. 물론 Member은 동일한 필드 및 속성 집합을 구현해야합니다. 이 경우 다음과 같은 작업을해야합니다 :

public class ParameterModifier<TSrc, TDest> : ExpressionVisitor 
{ 
    ParameterExpression parameter; 

    public ParameterModifier() 
    { 
     parameter = Expression.Parameter(typeof(TDest), "member"); 
    } 

    protected override Expression VisitParameter(ParameterExpression node) 
    { 
     if (node.Type == typeof(TSrc)) 
     { 
      return parameter; 
     } 
     else 
      return base.VisitParameter(node); 
    } 

    protected override Expression VisitMember(MemberExpression node) 
    { 
     if (node.Expression.Type == typeof(TSrc)) 
     { 
      return Expression.PropertyOrField(Visit(node.Expression), node.Member.Name); 
     } 
     else 
     { 
      return base.VisitMember(node); 
     } 
    } 

    protected override Expression VisitLambda<T>(Expression<T> node) 
    { 
     if (node.Parameters.Any(p => p.Type == typeof(TSrc))) 
     { 
      return Expression.Lambda(Visit(node.Body), node.Parameters.Select(p => p.Type == typeof(TSrc) ? parameter : p)); 
     } 
     else 
     { 
      return base.VisitLambda<T>(node); 
     } 
    } 
} 

을 위의 클래스를 사용하여 지금 변환 할 수있는 두 번째 방법에 술어를 통과하기 전에 :

IEnumerable<MemberViewModel> GetByProperty(Expression<Func<MemberViewModel, bool>> whereCondition) 
{ 
    var converter = new ParameterModifier<MemberViewModel, Member>(); 
    var convertedExpression = converter.Visit(original) as Expression<Func<Member, bool>>; 
    IEnumerable<Member> members = GetByProperty(convertedExpression); 
    return members.Select(new MemberViewModel(member)); 
}