Linq C#:整数dbnull值我该怎么检查呢?

时间:2017-01-02 22:06:11

标签: c# linq dbnull

我必须转换为linq这个查询sql:

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)

我尝试过这样的查询:

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而不是其他值!!!如何与DBNull的{​​{1}}值进行比较,其类型是可以为空的整数(c.IdAttivazione)?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

如果IdAttiviazoneNullable<Int32>,您应该能够直接比较为null,或者使用属性HasValue

&& c.IdAttivaZone == null

&& c.IdAttivaZone.HasValue

取决于你的linq到SQL查询提供程序的工作情况。