2009-09-14 2 views
2

동적 인 WHERE 절을 생성하기 위해 표준 방문자 패턴을 사용하여 LINQ 표현식 트리를 반복합니다.LINQ 표현식 트리에서 독립형 부울 표현식을 평가하는 방법

내 문제는 C#과 달리 SQL에서 독립 실행 형 불린 식을 사용할 수 없다는 것입니다.

WHERE Enabled OR Enabled = 0 

또는이 코드 :

h => h.Enabled || h.Enabled == false 

잘못이 코드를 생성하기 쉬운 것입니다 : 당신은이 가상 람다 식을 감안할 때 1 또는 0

과 비교해야

WHERE (Enabled = 1) OR (Enabled = 1) = 0 

둘 다 물론 SQL 오류가 발생합니다. 어떤 경우인지 파악하기 위해 하위 트리를 자세히 조사 할 때 코드가 정말 둔하게 보이지 않고이 문제를 해결하기 위해 어떤 논리를 적용해야합니까?

편집 : 위의 예는 물론 중복되어 있습니다. - 요점을 설명하기 위해서만 사용하고 있습니다. 이 시나리오 만들 수

예 : 당연히

h => h.Enabled 
h => h.Enabled == enabled 
h => h.Enabled == true 

을 내 코드가 중복 시나리오에 대한 수용하지에, 그래서 프로그래머의 기술 수준의 독립적으로 작동하도록 설계되고 가난한 스타일이지만, 마지막 예 것 내 부분에서 형편이 나쁘다.

답변

5

다음과 같은 경우 꽤 정직하고 있습니다 :

h => h.Enabled == enabled 
h => h.Enabled == true 

다음은 BinaryExpression 노드, 그리고 직접로 번역 할 수 있습니다 : 당신이 처리 할 필요가

WHERE (Enabled = @p0) 
WHERE (Enabled = 1) 

특별한 경우 (들) 위치 :

h => h.Enabled 
h => !h.Enabled 

이들은 표현식 n 트리 (예 : MemberExpression). 따라서 MemberExpression의 특별한 경우가 필요하며 부울 속성에 액세스하는지 여부를 결정해야합니다.당신은 식 트리를 사전 처리 할 수있을 것, 또는

WHERE (Enabled = 1) 
WHERE (Enabled = 0) 

과 정식으로 특별한 경우를 번역 : 그것이 경우에, 당신은 정규의 형식 (두 번째 예에서 UnaryExpression을 검출)로 번역 (표현 트리) 양식. 예를 들어 기준에 맞는 MemberExpression 노드를 올바른 BinaryExpression으로 변환 할 수 있습니다.

+0

안녕 나는 동일한 것을 달성하는 것을 시도하고있다. 이해 좀 도와 주시겠습니까? 예를 들어 하나의 표현식에 2 개의 다른 부울 표현식이있는 경우 x => x.IsBool || x.IsBool == tue. MemberExpressions를 방문하면이 코드 'WHERE IsBool = 1 OR IsBool = 1 = 1'이 발생합니다. 하나의 membereexpression이 redudant part와 다른 것을 구분하는 방법은 명시 적입니까? – DolceVita

0

연산자를 평가하기 전에 피연산자를 완전히 처리 할 수 ​​있습니까?

e. 평가는 각 :

h => h.Enabled 
h => h.Enabled == enabled 
h => h.Enabled == true 

연산자 람다에 포함되는 경우

WHERE (Enabled = 1) 

로하고, 공정 해당 SQL 렌더링 된 피연산자들의 콜렉션은 운전자의 요구 사항을 충족한다.

관련 문제