2017-09-07 5 views
1

표현 트리의 일부 속성 값을 읽고 싶습니다. 일부 계산을 진행할 수 있습니다.표현 트리에서 속성의 값을 읽는 방법은 무엇입니까?

var products = db.Products 
    .Where(GetPredicate()) 
    .ToList(); 

private Expression<Func<Product, bool>> GetPredicate() 
{ 
    ParameterExpression pe = Expression.Parameter(typeof(Product), "p"); 
    Expression exp0 = Expression.Property(pe, "Price"); 

    //I'd like to know the value of the 'Price' 
    // so I can do some calculation, then check whether 
    //this particular product meet the criteria... 

    Expression body = Expression.Constant(Result); //result is a boolean 
    var expr = Expression.Lambda<Func<Product, bool>>(body, new ParameterExpression[] { pe }); 
     return expr; 

} 
+1

Expression.Convert를 사용하려고 했습니까? – napi15

+0

[표현식 트리를 사용하여 개체 속성 읽기] (https://stackoverflow.com/questions/16436323/reading-properties-of-an-object-with-expression-trees) – johnnyRose

+1

식 트리를 만들 때 'GetPredicate'에서는'Product' 객체가 없으므로'Price' 값을 갖지 않습니다. 따라서 컴파일 된 표현식 트리에 전달하기 전에 실제 가치를 얻을 수는 없습니다. 그러나 표현 트리에 원하는대로 비교와 제약 조건을 추가 할 수 있습니다. 뭔가 다음과 같이 보입니다 :'Expression.Add (exp0, Expression.Constant (156));'그런 다음 반환 된 값 등을 확인할 수 있습니다. 그러나 값을 아직 알지 못한다면 입력 값이 비교된다는 것을 알 것입니다 내가 뭔가를 놓치거나 당신의 질문을 이해하지 못했습니까? –

답변

0

당신이 표현은 쿼리에 의해 이해되어 있는지 확인해야하는 문제를 해결하기 위해 표현식을 사용하기 전에 당신은 데이터베이스 쿼리 공급자 (LINQ2SQL, EF 등)

를 사용하는 것 공급자. 귀하의 경우에는 많은 Math 메서드를 T-SQL 유효 명령문으로 변환 할 수 있습니다. 또한 Entity Framework를 사용하는 경우 System.Data.Objects.SqlClient.SqlFunctions 클래스를 활용하여 식을 만들고 네이티브 T-SQL 함수에 대해 SQL Server 측에서 논리를 실행할 수 있습니다.

지금는 식 트리에 이해하는 일이, 값이이 LambdaExpression하지 않는 한, 일단 당신이 그것을 호출 컴파일, 건설 표현에서 얻을 수없는 귀하의 경우는 bool 값을 얻을 수 있다는 것입니다.

가격 값을 사용해야하는 경우 Math 클래스의 정적 Sqrt 메서드를 호출하는 식에서는 다른 논리에 대한 호출을 나타내는 식을 더 만들어야합니다. 모든 논리를 볼 수 있듯이

private Expression<Func<Product, bool>> GetPredicate() 
{ 
    var pe = Expression.Parameter(typeof(Product), "p"); 
    var price = Expression.Property(pe, "Price"); 
    var priceDouble = Expression.Convert(price, typeof(double)); 
    var sqrtMethod = typeof(Math).GetMethod("Sqrt"); 
    var sqrtCall = Expression.Call(sqrtMethod, priceDouble); 
    var constant = Expression.Constant(4d); 
    var gtThan = Expression.GreaterThan(sqrtCall, constant); 

    var lambda = Expression.Lambda<Func<Product, bool>>(gtThan, pe); 
    return lambda; 
} 

표현이며, 공급자는 전체 식을 소비하고 대상 프로세스가 이해할 수있는 구문으로 변환 할 수 있습니다. 이전 표현식 생성 p => Math.Sqrt((double)p.Price) > 4d