Linq选择字符串值“not equals”忽略DB null

时间:2014-03-27 10:19:24

标签: c# sql linq entity-framework

这里有些奇怪。通过Entity Framework访问的数据表具有可为空的字符串/ varchar的字段。

当您尝试使用Linq选择项目以获取不等于给定值的项目时,即

var thingsToRun = rep.Things.Where(t => t.Status != "Running");

你得到的是所有状态的列表,其中包含" Running" 除了那些状态为空的。

换句话说,如果你有三个状态为"运行"," NotRunning"和NULL,上面的查询只返回一个项目,状态为" NotRunning"。

我认为这与C#null和DB null之间的不匹配有关。但这看起来很奇怪。有一个简单的方法吗?

编辑:谢谢你的回答。仍然好奇为什么会发生这种情况?

3 个答案:

答案 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.