实体框架 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 并且为空的主要内容,如果未能解决你的问题,请参考以下文章