2009-03-26 11 views
6

क्योंकि मैं अपने डोमेन में पीओसीओएस का उपयोग कर रहा हूं, मैं चाहता हूं कि मेरा भंडार मेरे पीओसीओएस के प्रकार के अभिव्यक्ति फ़िल्टर प्राप्त करने में सक्षम हो और अभिव्यक्ति में पैरामीटर को मेरी 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

नहीं, आप एक ParameterExpression का परिवर्तन नहीं कर सकते पूरा करने के लिए है अभिव्यक्ति पेड़ अपरिवर्तनीय हैं); ऐसा करने के लिए आपको पूरे पेड़ को पुनर्निर्माण करना होगा। और हाँ, आपको अक्सर इसे फिर से भरना पड़ता है। क्षमा करें ...

संबंधित मुद्दे