在开发 web 应用程序时,我们常常需要根据传递的查询参数构建 SQL 语句的 Where 条件。本篇博客将介绍如何使用 C# 将 QueryString 参数列表拼接成 Where 条件,并提供了一些代码示例。
1. 拼接 Where 条件的需求
假设我们有一个名为 "products" 的表,其中包含以下字段:id、name、price、category。我们希望根据传递的查询参数动态构建 SQL 语句的 Where 条件,实现按照不同的过滤条件进行数据查询。
以下是几个示例查询参数列表:
- 查询价格大于100的产品:
?price_greater_than=100
- 查询价格小于等于50的产品:
?price_less_than_or_equal_to=50
- 查询名称包含"apple"的产品:
?name_contains=apple
- 查询分类为"电子产品"且价格大于1000的产品:
?category=电子产品&price_greater_than=1000
2. 拼接 Where 条件的实现
我们可以通过使用 System.Web.HttpUtility 类的 ParseQueryString 方法解析 QueryString 参数,并根据解析结果创建一个 Dictionary 对象,其中键是参数名称,值是参数值。
using System;
using System.Collections.Generic;
using System.Web;
public class QueryStringBuilder
{
public static string BuildWhereCondition(string queryString)
{
var parameters = HttpUtility.ParseQueryString(queryString);
var whereConditions = new List<string>();
foreach (var key in parameters.AllKeys)
{
var value = parameters[key];
switch (key.ToLower())
{
case "price_greater_than":
whereConditions.Add($"price > {value}");
break;
case "price_less_than_or_equal_to":
whereConditions.Add($"price <= {value}");
break;
case "name_contains":
whereConditions.Add($"name LIKE '%{value}%'");
break;
case "category":
whereConditions.Add($"category = '{value}'");
break;
// 添加其他的查询条件处理
default:
// 忽略未知的查询参数
break;
}
}
return whereConditions.Count > 0 ? string.Join(" AND ", whereConditions) : "1=1";
}
}
在上述代码中,我们使用了一个 Dictionary 对象存储查询参数,并根据不同的参数名称拼接相应的 Where 条件语句。值得注意的是,我们使用了 SQL 语句的占位符(placeholder)来防止 SQL 注入攻击。
同时,我们使用了一个 1=1 的条件作为默认的 Where 条件,这样即使没有传递任何查询参数,也可以返回所有记录。
3. 使用示例
下面是一些使用示例:
class Program
{
static void Main(string[] args)
{
var queryString = "?price_greater_than=100&category=电子产品";
var whereCondition = QueryStringBuilder.BuildWhereCondition(queryString);
Console.WriteLine($"Where 条件:{whereCondition}");
// 输出:Where 条件:price > 100 AND category = '电子产品'
}
}
4. 总结
在本篇博客中,我们介绍了如何使用 C# 将 QueryString 参数列表拼接成 SQL 语句的 Where 条件。通过解析 QueryString 参数,并根据参数名称动态构建 Where 条件语句,我们可以根据不同的查询参数进行灵活的数据查询。在实际开发中,请记得使用占位符来防止 SQL 注入攻击,并确保注释掉未知查询参数的情况。