2012-09-27 4 views
2

대로 작동하지 않는 카운트, 생성 된 SQL이 카운트에서! = NULL 체크()을 c.val을 무시Linq에이 (조건) 다음 LINQ 쿼리에서 예상

from t1 in table1 
join t2 in table2 on t1.col1 equals t2.col1 
where t1.col1 = 123 && t3.Count(c => c.val != null && c.col1 == t1.col1) == 0 
select new {t1.col1, t2.col2, t1.col2} 

SELECT [t0].[col1], [t1].[col2], [t0].[col2] 
FROM [t1] AS [t0] 
INNER JOIN [t2] AS [t1] ON [t0].[col1] = [t1].[col1] 
WHERE ([t0].[col1] = @p0) AND (((
    SELECT COUNT(*) 
    FROM [t3] AS [t2] 
    WHERE [t2].[col1] = [t0].[col1] 
    )) = @p1) 
변환됩니다 유일한

t.Count(c => c.ID != null && t.No > 10) 

로 변환되어 다음 기록시 반면

0

SELECT COUNT(*) AS [value] 
FROM [t] AS [t0] 
WHERE ([t0].[ID] IS NOT NULL) AND ([t0].[No] > @p0) 

여기서 c.ID! = null 검사를 건너 뛰지 않습니다. 이 문제가 발생하는 이유는 무엇입니까? where 절에서 Count 사용에 대한 제한이 있습니까?

+1

아마도 id는 null 가능하지만 val은 그렇지 않습니다. – sgmoore

+0

맞아요! 나는 그것을 놓쳤다. 감사! – Ali

답변

0

최적 화 때문입니다. sql이 null = null 인 경우, 이는 왜 첫 번째 표현식에서 여분의 null 체크가 필요하지 않은지를 설명합니다 (Linq에서 스마트 재 작성). 두 번째 표현의 transaltion은 a ==가 아니기 때문에 다른 최적화가 사용됩니다. 이 경우 구문 분석기는 ([t0]. [ID] IS NOT NULL) SQL 표현식에 값을 추가하지 않음을 알지 못합니다.

+0

예, Linq는 최적화를 수행합니다. 나는이 쿼리를 실험 해 보았고 추가 코드를 피하기 위해 최적화 작업을 수행했다. @ sgmoore의 제안은 나의 경우의 상황이었다. – Ali