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을 파서 도달!
어떻게 해결할 수 있습니까?
감사 :
이 사용하려고? –
@ 모하마드 예, 저는 그것을 사용했습니다 : http://metalinq.codeplex.com/. 내가 아는대로 표현식을 직렬화 가능 EditableExpression으로 변환합니다. 그리고 EditableExpression은 ToExpression() 메소드를 가지고있어 그것을 다시 Expression으로 변환합니다. – Tony
어셈블리를 다운로드 할 수 없으며 소스 코드가 VS 2012에서 열리지 않습니다. –