c# – 当where子句与NULL值进行比较时,LINQ-to-SQL查询不返回行

让我们考虑一个包含2列的表:ID(int)和Role(字符串).两者都可以为空.

现在假设两列中的数据是:

ID     Role
--     ----
 1     NULL
 2     Admin

查询如下所示:

List<types> t1 = (
    from a in datacontext.RoleTable 
    where a.Role != "Admin"
    select a
).ToList();

我认为上面的查询应该返回表的第一条记录,因为它的Role列不等于’Admin’,但查询返回一个空列表.

现在,当我使用此查询时:

List<types> t2 = (
    from a in datacontext.RoleType 
    where a.Role != "Admin" && a.Role == dbnull.Value.ToString() 
    select a
).ToList();

我得到了正确的答案.

任何人都可以告诉我为什么第一个查询不起作用.

仅供参考:如果表中第一行中的Role列更改为User而不是NULL,则第一个查询可以正常工作.

我正在使用sql Express和LINQ to sql.

解决方法

一个查询的行为不符合预期,因为它被转换为sql,它等效于以下内容
select * from RoleTable where Role != 'Admin'

现在,在sql NULL!=’Admin’不是TRUE(也不是FALSE – 它是未定义的).
这是LINQ to sql提供的抽象漏洞并且您仍然需要知道sql的许多情况之一.

顺便说一句:你的第二个查询也是错误的,它只会选择那些为null的行.它不会选择具有“用户”角色的行.

正确的查询将如下所示:

List<types> t2 = 
    (from a in datacontext.RoleTable 
     where a.Role != "Admin" || a.Role == null 
     select a).ToList();

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...