2009-03-26 15 views
6

私は自分のドメインでPOCOSを使用しているので、自分のリポジトリが自分のPOCOS型の式フィルタを受け取り、式のパラメータを自分のLINQテーブルの型に変更できるようにしたい私のメンバーとして私は1と2のラムダ条件をメンバと定数に分割することでこれを達成できました。条件を追加すると、バイナリ式を再帰的に解析します。式のパラメータの種類を変更する方法は?

(これは、私が終わった方法です

var q = from p in 
     db.products.Where(ExpressionBuilder.Create<MyPocoProduct,LinqProduct>(myPocoProductExpression)) 

私は

public class ExpressionBuilder 
    { 
     public static Expression<Func<TLinq, bool>> Create<TEntity, TLinq>(Expression<Func<TEntity, bool>> predicate) 
     { 

      try 
      { 
       //get the predicate body 
       var binaryExpr = (BinaryExpression)predicate.Body; 

       //holds the resuting Expression 
       var expressionResult = default(BinaryExpression); 

       // Create the parameter of the Linq table Type 
       ParameterExpression parameter = Expression.Parameter(typeof(TLinq), predicate.Parameters[0].Name); 


       //if only one condition was passed 
       if (binaryExpr.Left is MemberExpression) 
       { 
        expressionResult = CreateExpression(binaryExpr, parameter,binaryExpr.NodeType); 

       } 
       else if (binaryExpr.Left is BinaryExpression) 
       { 
        var predicatesList = new List<BinaryExpression>(); 

        var leftExp = CreateExpression((BinaryExpression)binaryExpr.Left, parameter, binaryExpr.Left.NodeType); 
        var RightExp = CreateExpression((BinaryExpression)binaryExpr.Right, parameter, binaryExpr.Right.NodeType); 

        expressionResult = Expression.And(leftExp, RightExp); 


       } 

       return Expression.Lambda<Func<TLinq, bool>>(expressionResult, parameter); 
      } 
      catch (Exception ex) 
      { 
       throw new Exception("Eror While creating Filter", ex); 
      } 

     } 

     private static BinaryExpression CreateExpression(BinaryExpression expression, ParameterExpression parameter,ExpressionType expType) 
     { 

      var memberExp = expression.Left as MemberExpression; 

      if (memberExp == null) throw new ArgumentException("left expression is not a member Expression"); 

      //create the Member expression 
      MemberExpression member = LambdaExpression.PropertyOrField(parameter, memberExp.Member.Name); 

      //create the constant against the value 
      ConstantExpression constant = Expression.Constant(((ConstantExpression)expression.Right).Value); 


      return CreateExpressionOfType(expType, member, constant); 


     } 


     private static BinaryExpression CreateExpressionOfType(ExpressionType expType, MemberExpression member, ConstantExpression constant) 
     { 

      //creates the body fo the lambda 
      var resultExpression = default(BinaryExpression); 
      switch (expType) 
      { 

       case ExpressionType.And: 
        break; 
       case ExpressionType.AndAlso: 
        break; 
       case ExpressionType.ConvertChecked: 
        break; 
       case ExpressionType.Equal: 
        resultExpression = Expression.Equal(member, constant); 
        break; 
       case ExpressionType.ExclusiveOr: 
        break; 
       case ExpressionType.GreaterThan: 
        resultExpression = Expression.GreaterThan(member, constant); 
        break; 
       case ExpressionType.GreaterThanOrEqual: 
        break; 
       case ExpressionType.LessThan: 
        resultExpression = Expression.LessThan(member, constant); 
        break; 
       case ExpressionType.LessThanOrEqual: 
        break; 
       case ExpressionType.Not: 
        break; 
       case ExpressionType.NotEqual: 
        break; 
       default: 
        break; 
      } 

      return resultExpression; 


     } 


    } 

答えて

3

それを変更する方法はこれを達成する簡単な方法はありません、あなたは​​の種類を変更することはできません表現木は不変です)。これを行うにはツリー全体を再構築する必要があります。そして、はい、あなたはしばしばそれを繰り返しなければなりません。申し訳ありません...

関連する問題