让我们考虑一个包含2列的表:ID(int)和Role(字符串).两者都可以为空.
现在假设两列中的数据是:
ID Role
-- ----
1 NULL
2 Admin
Run Code Online (Sandbox Code Playgroud)
查询如下所示:
List<types> t1 = (
from a in datacontext.RoleTable
where a.Role != "Admin"
select a
).ToList();
Run Code Online (Sandbox Code Playgroud)
我认为上面的查询应该返回表的第一条记录,因为它的Role列不等于'Admin',但查询返回一个空列表.
现在,当我使用此查询时:
List<types> t2 = (
from a in datacontext.RoleType
where a.Role != "Admin" && a.Role == DBNull.Value.ToString()
select a
).ToList();
Run Code Online (Sandbox Code Playgroud)
我得到了正确的答案.
任何人都可以告诉我为什么第一个查询不起作用.
仅供参考:如果表中第一行中的"角色"列已更改为User,NULL则第一个查询可以正常工作.
我正在使用SQL Express和LINQ to SQL.
Dan*_*rth 10
第一个查询的行为不符合预期,因为它被转换为SQL,它等效于以下内容:
select * from RoleTable where Role != 'Admin'
Run Code Online (Sandbox Code Playgroud)
现在,在SQL NULL != '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();
Run Code Online (Sandbox Code Playgroud)