2017-01-02 12 views
1

내가 LINQ에이 쿼리의 SQL을 변환해야합니다은 :Linq C# : 정수 dbnull 값 어떻게 확인할 수 있습니까?

var numClienti = (from u in contestoDB.tab1 
join c in contestoDB.tab2 on u.IdUtente equals c.IdAttivazione 
where u.Demo == demo && u.idRivenditore == 0 && u.IdGruppo != 29 && u.IdGruppo != 130 && u.IdGruppo != 117 && (c.IdAttivazione.ToString() == null) 
select u.IdUtente 
).Count(); 

를하지만 항상 0이 아닌 다른 값을 반환! :

SELECT DISTINCT COUNT(tab1.IdUtente) AS NumClientiSenzaAccessi 
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.IdUtente = tab2.IdAttivazione 
WHERE (tab1.Demo = 0) AND (tab1.idRivenditore = 0) AND (tab1.IdGruppo <> 29) AND (tab1.IdGruppo <> 130) AND (tab1.IdGruppo <> 117) AND (tab2.IdAttivazione IS NULL) 

나는이 쿼리를 수행하려고했습니다 DBNull 값이 c.IdAttivazione이고 그 유형이 Null 허용 정수 (int?)와 비교하려면 어떻게해야합니까?

+0

가능한 복제 [LEFT OUTER은 LINQ에 가입 (http://stackoverflow.com/questions/3404975/left-outer-join-in-linq) –

답변

1

가입시 into을 사용하고 그 중 하나를 선택하고 DefaultIfEmpty()을 사용해야하므로 왼쪽 가입을하고 오른쪽에 가입하지 않은 왼쪽의 모든 레코드를 유지할 수 있습니다. 의

var numClienti = (from u in contestoDB.tab1 
join c in contestoDB.tab2 on u.IdUtente equals c.IdAttivazione into uc 
from ucc in uc.DefaultIfEmpty() 
where u.Demo == demo && u.idRivenditore == 0 && u.IdGruppo != 29 && u.IdGruppo != 130 && u.IdGruppo != 117 && (ucc.IdAttivazione.ToString() == null) 
select u.IdUtente 
).Distinct().Count(); 
+0

내가 시도했지만 c를하지 존재 .. ... –

+0

(c.IdAttivazione.ToString() == null) => (ucc.IdAttivazione.ToString() == null) –

+0

@MikeVinyl 미안하지만 이해가 안 되니? 나 한테 질문하는거야? – CodingYoshi

0

IdAttiviazoneNullable<Int32> 일 경우 null과 직접 비교하거나 HasValue 속성을 사용할 수 있습니다.

&& c.IdAttivaZone.HasValue 

&& c.IdAttivaZone == null 

또는

는 SQL 쿼리 공급자로 LINQ가 얼마나 잘 작동하는지에 따라 달라집니다.