2012-03-10 12 views
0

私はviewmodel(memberviewmodelと言う)とef model(メンバーと言う)があります。どのように私は転置または翻訳式Linq

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

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

に任意のアイデアから翻訳していますか?

サービスはメソッドGetByProperty(Expression> whereCondition)を公開しますが、サービス内でメソッドGetByProperty(Expression> whereCondition)を公開するビジネスオブジェクトを呼び出します。

+0

あなたが翻訳し何を意味するのですか? getsingleさんに電話したいですか? –

+0

どのように私はそれらの2つの方法の間で通信するのですか? whereConditionを2番目のメソッドに渡すだけでは使えないのですか? – user384080

答えて

1

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)); 
}