当我在 c# 中显示从查询生成的 SQL 时,最后一部分是啥?我可以删除它吗?

Posted

技术标签:

【中文标题】当我在 c# 中显示从查询生成的 SQL 时,最后一部分是啥?我可以删除它吗?【英文标题】:What is this last part when i display my generated SQL from query in c#? And can i remove it?当我在 c# 中显示从查询生成的 SQL 时,最后一部分是什么?我可以删除它吗? 【发布时间】:2022-01-11 12:07:57 【问题描述】:

当我从 C# 生成查询时,它会显示这个

SELECT [Extent1].[Id] AS [Id], [Extent1].[RegionName] AS [RegionName] 
FROM [dbo].[RegionClasses] AS [Extent1] 
WHERE ([Extent1].[RegionName] = @p__linq__0) 
  OR (([Extent1].[RegionName] IS NULL) AND (@p__linq__0 IS NULL))

但问题是最后一个“OR”在哪里。为什么它在那里,我如何删除它?它有什么作用?

下面是我的 C# 查询代码:

var RegionlinqQuery = from regions
                      in ctx.Regions
                      where regions.RegionName == SearchTextBox.Text
                      select regions;

string sqlQuery = RegionlinqQuery.ToString();
RegionLabel.Text = sqlQuery;

【问题讨论】:

它比较 null RegionName 和 null SearchTextBox.Text 并认为它们相等 在 sql 中,如果一个字段为 null,则无法将其与 = 进行比较,这就是生成的查询具有 is null 部分的原因。 @MatJ 有没有办法通过编辑查询中的代码来删除它?还是如果我必须将 texbox 与名称进行比较是不可能的? 请注意,编译器会将其优化为仅WHERE ([Extent1].[RegionName] IS @p__linq__0),这作为 SQL 文本无效,请参阅dbfiddle.uk/… @Charlieface 我明白了,谢谢,我需要的只是让我自己更清楚地了解它是如何工作的。 【参考方案1】:

您需要启用context.Configuration.UseDatabaseNullSemantics 以禁用此行为。您可以查看documentation here

【讨论】:

好吧,OP 还问“它有什么作用?” 所以这可能不是他们需要的。在不理解语义的情况下,这可能只是一种 I-don't-understand-this-so-take-it-away! 的怪异反应。他们应用了这个解决方案,然后当他们想与 null 进行比较时,他们的代码不起作用,并想知道为什么 that 现在不起作用。 兄弟,非常感谢。

以上是关于当我在 c# 中显示从查询生成的 SQL 时,最后一部分是啥?我可以删除它吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 中的 SQL 数据库读取 DateTime 值时没有毫秒值

生成使用 c# 代码执行的查询的 sql 脚本

C#:SQL 查询生成器类

使用 C# 从 Excel 2007 批量上传 SQL 服务器时出错

codeigniter 查询生成器和活动记录 sql 注入

当我在数据库Java Derby中插入新数据时生成的ID错误