实体框架 6 并且为空

Posted

技术标签:

【中文标题】实体框架 6 并且为空【英文标题】:Entity Framework 6 and is null 【发布时间】: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 【参考方案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。

【讨论】:

以上是关于实体框架 6 并且为空的主要内容,如果未能解决你的问题,请参考以下文章

判断字符串为空为 null 为 whitespace 工具类

linux字符测试

实体框架:值不能为空。参数名称:类型

实体框架未声明 datetime.now 为空

必需的属性,但可以为空,通过代码优先的实体框架

实体框架代码优先 - 不可为空类型的默认值