6

让我们考虑一个有 2 列的表:ID (int) 和 Role(string)。两者都可以为空。

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

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。

4

1 回答 1

10

第一个查询的行为与预期不符,因为它被转换为等效于以下内容的 SQL:

select * from RoleTable where Role != 'Admin'

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

顺便说一句:您的第二个查询也不正确,它只会选择那些null. 它不会选择具有角色的行'User'

正确的查询如下所示:

List<types> t2 = 
    (from a in datacontext.RoleTable 
     where a.Role != "Admin" || a.Role == null 
     select a).ToList();
于 2013-08-06T11:42:07.867 回答