当我在 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 值时没有毫秒值