【问题标题】:Entity Framework 6 and is null实体框架 6 并且为空
【发布时间】:2021-10-26 13:28:19
【问题描述】:

我想获取所有行 来自一个表,其中列:CODEFIN (varchar) not like "MIR" or "CED"。

我的桌子是这样的:

CODEFIN ID
NULL 2
NULL 3
MIR 2

我的实体框架 linq 请求是

db.MYTABLE.Where(m => m.CODEFIN !="MIR" && m.CODEFIN != "CED") [...]

但是没有出现CODEFIN空行...

我得到了生成的 sql,但这在我的 sql 编辑器中是一样的。

sql是这样的:

    SELECT 
    [Extent1].[CODEFIN] AS [CODEFIN],
    [Extent1].[ID] AS [ID], 
    FROM [dbo].[MYTABLE] AS [Extent1]
    WHERE ('MIR' <> [Extent1].[CODEFIN] AND 'CED' <> [Extent1].[CODEFIN])

谢谢。 西尔文

【问题讨论】:

  • NULL 在数据库中是“特殊的” - 比较 "foo" != NULL 实际上是 false

标签: c# sql entity-framework linq


【解决方案1】:

我会这样做

db.MYTABLE.Where(m => m.CODEFIN == NULL ||
    (m.CODEFIN !="MIR" && m.CODEFIN != "CED"))

或使用Contains:

db.MYTABLE.Where(m => m.CODEFIN == NULL ||
    !(new [] {"MIR", "CED"}.Contains(m.CODEFIN)))

这会产生 SQL:

WHERE [Extent1].[CODEFIN] IS NULL OR ([Extent1].[CODEFIN] NOT IN ('MIR', 'CED'))

比较某些东西(甚至是NULL)与NULL 总是得到NULL,而不是FALSE,并且NOT(NULL) 仍然是NULL,而不是TRUE,所以你必须更明确地检查对于空值。

【讨论】:

  • EF 没有用这个解决方案在 sql 中为我生成“IS NULL”
【解决方案2】:

添加:

&& m.CODEFIN == null

【讨论】:

    【解决方案3】:

    有时更有效的解决方案是使用Except

    db.MYTABLE.Where(m => new [] {"MIR", "CED"}
                  .Except(new[] {m.CODEFIN})
                  .Any())
    

    这应该会产生以下 SQL

    WHERE EXISTS (
        SELECT 'MIR'
        UNION
        SELECT 'CED'
        EXCEPT
        SELECT [Extent1].[CODEFIN]
    )
    

    这很有效,as shown here

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多