【发布时间】:2021-01-22 04:36:29
【问题描述】:
为什么当我在 Entity Framework Core 中查询字符串 Not Equals 时它会返回 NULL 值(通过附加“或 ISNULL(字段)”),但是当我查询例如“不包含”或“不 StartWith”时" 不会
我知道我可以通过手动添加到查询中以包含 NULL 来实现相同的结果,我的问题是为什么 2 在涉及 NULL 时表现不同?有什么明显的原因吗?
代码示例:
C# - dbContext.Employee.Where(x => x.jobNotes != "abc").Select(x => x.firstName).ToList();
生成的 Sql - exec sp_executesql N'SELECT [x].[firstName] FROM [Employee] AS [x] WHERE (([x].[jobNotes] <> N''abc'') OR [x].[jobNotes] IS NULL)'
C# - dbContext.Employee.Where(x => !x.jobNotes.Contains("abc")).Select(x => x.firstName).ToList();
生成的 Sql - exec sp_executesql N'SELECT [x].[firstName] FROM [Employee] AS [x] WHERE (CHARINDEX(N''abc'', [x].[jobNotes]) <= 0)'
【问题讨论】:
-
您要问的是“为什么 EF Core 团队决定做出这个具体的实施决定”,不幸的是,除非在场的人是核心团队成员,否则任何答案都是猜测。可能值得在 EF Core 存储库上打开一个问题以了解清楚。
-
嗯,这很有意义。 NULL 不是“Hello World”,因此如果我查询“所有内容但“Hello World””,请包含 NULLS。但是 NULL 永远不会包含任何内容,也不会以字符串开头。所以从我的结果中排除它。
-
请edit 您的问题包括您在 C# 代码中的 LINQ(?) 语句和生成的 SQL 语句。然后解释您想要(或不想要)任何
ISNULL()语句的位置以及原因。