【发布时间】:2021-08-26 08:40:40
【问题描述】:
我正在尝试创建具有多个条件的参数化 sql 查询。我在使用模块 System.Data.Common.DbCommand
的实体框架版本 2.2 和 MSSQL 2016 上打开一个命令当我将 @tenantName 之后的 AND 更改为 OR 时,sql 命令起作用。我需要它是一个 AND 语句才能得到正确的数字。
以下 sql 命令代码无效,但在 sql management studio 中有效
var command = _context.Database.GetDbConnection().CreateCommand();
command.Transaction = _context.Database.CurrentTransaction.GetDbTransaction();
command.Parameters.Add(new SqlParameter("@tenantName", tenantName));
command.Parameters.Add(new SqlParameter("@searchTerm", searchTerm));
command.Parameters.Add(new SqlParameter("@hashedSearchTerm", hashedSearchTerm));
command.CommandText = "SELECT COUNT(*) FROM dbo.IdpUserEventLog WHERE " +
"(TenantName IS NOT NULL AND TenantName = @tenantName) AND (" +
"(EventType IS NOT NULL AND EventType LIKE '%@searchTerm%') " +
"OR (AppName IS NOT NULL AND AppName LIKE '%@searchTerm%') " +
"OR (EventExtra IS NOT NULL AND EventExtra LIKE '%@searchTerm%') " +
"OR (EventDescription IS NOT NULL AND EventDescription LIKE '%@searchTerm%') " +
"OR (EventResultReport IS NOT NULL AND EventResultReport LIKE '%@searchTerm%') " +
"OR (EventDescription IS NOT NULL AND EventDescription LIKE '%@hashedSearchTerm%') " +
"OR (EventExtra IS NOT NULL AND EventExtra LIKE '%@hashedSearchTerm%')) " +
【问题讨论】:
-
“不工作”是什么意思。仅将
AND替换为OR不会使查询功能或功能失调。查询仍将执行,但结果可能不如预期。但是,如果没有任何示例数据,这是不可能的…… -
您的查询格式错误。查看 MSDN 中的此示例以使用实体框架构建您的查询:docs.microsoft.com/es-es/dotnet/framework/data/adonet/ef/…
-
TenantName IS NOT NULL AND可以被删除,因为它什么都不做。大多数空检查都是一样的。 -
'%@hashedSearchTerm%'应该是@hashedSearchTerm。%应该包含在hashedSearchTerm的值中(在 C# 中,而不是在 SQL 中)。其他喜欢的也一样。 -
您的情况可能是“短路评估”。即你的
WHERE子句的第二部分(即AND之后的任何内容)永远不会评估为真(因为@mjwills 提到了错误的like条件),因此condition1 AND condition2也将是假的。但是当您使用condition1 OR condition2时,第二部分根本不会被计算(因为如果条件1 已经为真,则整个表达式变为真,而不管条件2 的结果如何)
标签: c# sql sql-server sql-server-2016