LinQ中为null的判断解决方案

先看部门表设计和数据:


注意:Pid为父部门的Id号,如果是顶级部门则没有PId(pid为null)

如果要查询为NULL的PId,我们知道SQL语句应该是:
SELECT * FROM DEPART WHERE PID IS NULL
很多人用LinQ写成:

Code:
  1. int?pid=null;
  2. List<Depart>departList=context.Depart.Where(c=>c.PId==pid).ToList();

但是,结果departList.Count确为0.!怎么回事呢?查看LinQ生成的SQL语句才发现是=null判断,而不是is null判断。

Code:
  1. CompanyDataContextcontext=newCompanyDataContext();
  2. int?parentDepartId=null;
  3. IQueryable<Depart>query=null;
  4. //获取顶级部门的子部门数量
  5. query=fromdepartincontext.Depart
  6. wheredepart.PId==parentDepartId
  7. selectdepart;
  8. /*SELECT[t0].[Id],[t0].[Name],[t0].[PId]
  9. FROM[dbo].[Depart]AS[t0]
  10. WHERE[t0].[PId]=@p0*/
  11. List<Depart>departList=query.ToList();
  12. Console.WriteLine("count={0}",departList.Count);//count=0
  13. query=fromdepartincontext.Depart
  14. whereNullable<int>.Equals(depart.PId,parentDepartId)
  15. selectdepart;
  16. /*SELECT[t0].[Id],[t0].[Name],[t0].[PId]
  17. FROM[dbo].[Depart]AS[t0]
  18. WHERE[t0].[PId]ISNULL*/
  19. departList=query.ToList();
  20. Console.WriteLine("count={0}",departList.Count);//count=2
  21. parentDepartId=1;
  22. //获取1号部门的子部门数量
  23. query=fromdepartincontext.Depart
  24. wheredepart.PId==parentDepartId
  25. selectdepart;
  26. /*SELECT[t0].[Id],[t0].[Name],[t0].[PId]
  27. FROM[dbo].[Depart]AS[t0]
  28. WHERE[t0].[PId]=@p0*/
  29. departList=query.ToList();
  30. Console.WriteLine("count={0}",departList.Count);//count=0
  31. query=fromdepartincontext.Depart
  32. whereNullable<int>.Equals(depart.PId,parentDepartId)
  33. selectdepart;
  34. /*SELECT[t0].[Id],[t0].[Name],[t0].[PId]
  35. FROM[dbo].[Depart]AS[t0]
  36. WHERE([t0].[PId]ISNOTNULL)AND([t0].[PId]=@p0)*/
  37. departList=query.ToList();
  38. Console.WriteLine("count={0}",departList.Count);//count=2

为了演示,我采用了query查询,因为这样才能看到sql语句,现在我们看,如果要查询为null的结果,应该采用Nullable<T>.Equals()判断。注意第二个query,where Nullable<int>.Equals(depart.PId, parentDepartId)这样才能生成is null的sql,当parentDepartId不为null时,生成sql:WHERE ([t0].[PId] IS NOT NULL) AND ([t0].[PId] = @p0)。

所以:当数据库字段可以为空时,应采用Nullable<T>.Equals()判断,而不应该用==或Equals。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值