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

时间:2013-08-06 11:35:49

标签: c# 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();

我得到了正确答案。

有人可以告诉我为什么第一个查询不起作用。

仅供参考:如果表格第一行中的“角色”列更改为User而不是NULL,则第一个查询可以正常运行。

我正在使用SQL Express和LINQ to SQL。

1 个答案:

答案 0 :(得分:10)

第一个查询的行为不符合预期,因为它被翻译成SQL,等同于以下内容:

select * from RoleTable where Role != 'Admin'

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

BTW:您的第二个查询也不正确,它只会选择那些null的行。它不会选择角色为'User'的行。

正确的查询如下所示:

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