2013-12-10 2 views
1

나는 모델에 Expression<Func<Entity, bool>>을 구문 분석 싶어요 :식 <Func <Entity, bool >>을 모델로 구문 분석 하시겠습니까?

public class Program 
{ 
    static void Main() 
    { 
     List<Entity> entities = new List<Entity> 
     { 
      new Entity{ Id = 1, FullName = "Mohammad Dayyan"}, 
      new Entity{ Id = 2, FullName = "Zahra Ahmadi"}, 
      new Entity{ Id = 3, FullName = "Milad Ahmadi"}, 
      new Entity{ Id = 4, FullName = "Ali Dayyan"}, 
      new Entity{ Id = 5, FullName = "Masoud Ahmadi"}, 
     }; 

     //PredicateBuilder is from LinqKit http://www.albahari.com/nutshell/linqkit.aspx 
     Expression<Func<Entity, bool>> predicate2 = PredicateBuilder.False<Entity>(); 
     predicate2 = predicate2.Or(q => q.Id == 1); 
     predicate2 = predicate2.Or(q => q.Id == 3); 
     predicate2 = predicate2.Or(q => q.Id == 5); 

     Expression<Func<Entity, bool>> predicate1 = PredicateBuilder.True<Entity>(); 
     predicate1 = predicate1.And(q => q.FullName.Contains("Milad")); 

//Predicate3 == {((True AndAlso Invoke(q => q.FullName.Contains("Milad"), f)) AndAlso Invoke(f => (((False OrElse (f.Id == 1)) OrElse (f.Id == 3)) OrElse (f.Id == 5)), f))} 
     Expression<Func<Entity, bool>> predicate3 = predicate1.And(predicate2);  

     ExpressionModel model = ParseExpression(predicate3);  

     Console.WriteLine(model); 
     Console.ReadKey(); 
    } 

    static ExpressionModel ParseExpression(Expression<Func<Entity, bool>> expression) 
{ 

    BinaryExpression binaryExpression = expression.Body as BinaryExpression; 
    if (binaryExpression == null) return null; 
    Expression left = binaryExpression.Left; 
    Expression right = binaryExpression.Right; 
    ExpressionModel expressionModel = new ExpressionModel 
    { 
     NodeType = binaryExpression.NodeType, 
     Left = ParseExpression(left), 
     Right = ParseExpression(right) 
    }; 
    return expressionModel; 
} 

static ExpressionModel ParseExpression(Expression expression) 
{ 

    BinaryExpression binaryExpression = expression as BinaryExpression; 
    if (binaryExpression == null) return null; 
    Expression left = binaryExpression.Left; 
    Expression right = binaryExpression.Right; 
    ExpressionModel expressionModel = new ExpressionModel 
    { 
     NodeType = binaryExpression.NodeType, 
     Left = ParseExpression(left), 
     Right = ParseExpression(right) 
    }; 
    return expressionModel; 
} 
} 


[Serializable] 
public class Entity 
{ 
    public int Id { get; set; } 
    public string FullName { get; set; } 
} 

[Serializable] 
public class ExpressionModel 
{ 
    public ExpressionModel Left { get; set; } 
    public ExpressionModel Right { get; set; } 
    public ExpressionType NodeType { get; set; } 
} 

그러나 때 True 또는 Invoke(q => q.FullName.Contains("Milad"), f)ParseExpression 메소드는 null을 파서 도달!

어떻게 해결할 수 있습니까?

답변

2

가 BinaryExpression을하지 beacuse이 Invoke(q => q.FullName.Contains("Milad"), f)이하는 MethodCallExpression 및 이

BinaryExpression binaryExpression = expression as BinaryExpression; 
if (binaryExpression == null) return null; 

반환 널 (null)이기 때문입니다.

True은 ConstantExpression입니다. 구문 분석하고 모든 옵션을 처리하려면 더 복잡한 코드가 필요합니다. 당신은 식을 구문 분석에 대한 모든 소스 또는 libs와 알아, 응답에 대한 metalinq

+0

감사 :

이 사용하려고? –

+0

@ 모하마드 예, 저는 그것을 사용했습니다 : http://metalinq.codeplex.com/. 내가 아는대로 표현식을 직렬화 가능 EditableExpression으로 변환합니다. 그리고 EditableExpression은 ToExpression() 메소드를 가지고있어 그것을 다시 Expression으로 변환합니다. – Tony

+0

어셈블리를 다운로드 할 수 없으며 소스 코드가 VS 2012에서 열리지 않습니다. –