【发布时间】:2022-01-25 06:27:59
【问题描述】:
我有一个 C# 应用程序,其中包含一个包含此 WHERE 子句的 SQL 查询:
WHERE
A.Location = @Location
AND Widgets.Branch = @Branch
要求已更改,因此用户可以要求查看所有分支。我知道我可以编写一个 if 语句来查看我是否有一个已传入的分支参数......然后有一个不同的 select 语句完全省略了分支的 AND 子句。
但我想知道是否有更简单的方法可以做到这一点?我可以传入某种通配符吗?
我尝试了 '*' 或 '%' 但这似乎不是正确的语法。我知道 % 与 LIKE 一起使用...
任何建议/提示将不胜感激。
编辑 1
所以我想弄清楚如何使用
WHERE
A.Location = @Location
AND (@Branch IS NULL OR Widgets.Branch = @Branch)
接近。
我的部分代码如下所示:
using (var conn = new SqlConnection(connectionString))
{
activityByUserType = conn.Query<ActivityDetailsByUserTypes>(
@"
SELECT
ReportRefreshDate,
other columns...
FROM
(SELECT
columns
FROM table1 A
INNER JOIN Widgets ON LOWER(fieldAA) = LOWER(A.fieldAA)
WHERE
A.Location = @Location
AND Widgets.Branch = @Branch) DetailedResults
GROUP BY ReportRefreshDate;
",
new { Branch=branchId, Location = LocationId, RefreshDate = dateRange}).ToList();
}
return activityByUserType;
如您所见,我正在创建一个新的查询对象......并在代码块的末尾传递一个参数列表给它。
我更改了逻辑以在 USING() 之前添加此 if 语句
if (branchId.Equals("allbranches"))
{
branchId = null;
}
但这似乎并没有真正起作用。
【问题讨论】:
-
我知道我可以写一个 if 语句 .. 然后有一个不同的 [where] 语句完全省略分支的 AND 子句 - 是的,你应该跨度>
-
寻找避免编写代码的技巧(即“更简单的方式”)可能会导致代码效率降低。我留给你 Erland 对 dynamic search conditions 的讨论,它在存储过程的上下文中讨论了这一点——但同样的考虑也适用于你的应用程序代码。
-
@CaiusJard 你能解释一下为什么这种方法更好吗?那会很有帮助。
-
SMor 发布了一个深入了解它的链接 - 这是我想到的,但找不到..
-
@SM如果你作为答案发帖,我会接受。
标签: c# sql sql-server wildcard