2013-07-28 5 views
3

LinqExpression을 SQL 문으로 변환하려고합니다. 예를 들어, 내 Repository 기본 클래스에서 LinqExpression을 인수로 허용하는 Find 메서드가 있습니다. Find 메서드 내에서, 나는 다음과 같은 작업을 수행하는 방법 호출 오전 :LinqExpression : 비교 평가에서 값을 얻는 방법

var equality = expression as BinaryExpression; 
       return equality.Left.Translate() + " = " + 
         equality.Right.Translate(); 

가 어떻게 오른쪽에있는 변수의 값뿐 아니라 변수 이름을 얻을 수를 현재 난 단지 변수를 얻고있다 이름. 전의. 찾기 (x => x.ID = variable); 변수가 현재 7로 설정되어 있으면 이름 변수가 아닌 값 7을 가져 오는 방법이 필요합니다. 변수에 저장된 값을 얻는 올바른 방법은 무엇입니까?

답변

0

는 각각 MemberExpression 또는 ConstantExpression로 전송 해 봅니다 :

var memberExpression = (MemberExpression) expression.Left; 
    var constantExpression = (ConstantExpression) expression.Right; 

아,이 변수였다 놓쳤다. 그런 다음 오른쪽 피연산자는 ParameterException이어야합니다. 그러나 사용할 수있는 가치를 얻으려면

Func<object> getValue = expression.Compile(); 
var value = getValue(); 

유의할 점은 느린 점에 유의하십시오.

+0

이 경우를 제외하고는 'expression.Right'가 상수가 아니라 클로저 변수로 캡처 된 것으로 보입니다. 그것은'ConstantExpression'이 아님을 의미합니다. – svick

+0

네, 맞습니다. 나는 그것이 변수라는 것을 놓쳤다. 그래서 그것은 _ParameterExpression_이어야합니다. – mkoertgen

1

Matt Warren's article LINQ: Building an IQueryable Provider - Part III을 살펴보십시오. 그것은 인라인 될 수있는 모든 값을 인라인 할 Evaluator 클래스의 코드를 포함합니다. 귀하의 경우에는 variableConstantExpression으로 대체하고 값은 7입니다.

이 시리즈의 나머지 기사도 관심의 대상 일 수 있습니다.

+0

인용 된 기사에서 설명한 _Expression.Compile() _을 사용하기 전에 표현식을 로컬에서 평가하려고 시도하는 것이 좋습니다. – mkoertgen