让我们考虑一个包含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();
我得到了正确的答案.
解决方法
第一个查询的行为不符合预期,因为它被转换为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();
原文地址:https://www.jb51.cc/csharp/92044.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。