这里有些奇怪。通过Entity Framework访问的数据表具有可为空的字符串/ varchar的字段。
当您尝试使用Linq选择项目以获取不等于给定值的项目时,即
var thingsToRun = rep.Things.Where(t => t.Status != "Running");
你得到的是所有状态的列表,其中包含" Running" 除了那些状态为空的。
换句话说,如果你有三个状态为"运行"," NotRunning"和NULL,上面的查询只返回一个项目,状态为" NotRunning"。
我认为这与C#null和DB null之间的不匹配有关。但这看起来很奇怪。有一个简单的方法吗?
编辑:谢谢你的回答。仍然好奇为什么会发生这种情况?答案 0 :(得分:4)
在查询中包含null
var thingsToRun = rep.Things.Where(t => t.Status == null || t.Status != "Running");
答案 1 :(得分:3)
您可以明确测试null
:
var thingsToRun
= rep.Things.Where(t => t.Status == null || t.Status != "Running");
至于为什么,蒂姆在评论中提供了一个很好的答案。为了更完整的答案,我会在这里放一些东西。数据库中的值null
通常不等于任何内容,而不是"不等于"任何事情。无论如何,它都无法与任何价值相媲美。
我不能说这是每个数据库处理null
的方式,但通常情况下,如果您有一个包含三个记录的数据库,则使用您的示例,&# 34;运行"," NotRunning",然后为null,然后
... WHERE some_column = 'RUNNING' <- returns one record
... WHERE some_column <> 'RUNNING' <- returns one record
... WHERE some_column IS NULL <- returns one record
如果您能够在LINQ语句上放置断点并查看生成的SQL是否在对象中的任何位置可见,您可能能够准确地确定正在进行的操作。我猜你会看到== null
被翻译为IS NULL
。
答案 2 :(得分:1)
因为null!=未定义运行:既不是真也不是假。
您可能需要查看this thread.