在我们写SQL时,经常会遇到IN
、NOT IN
这样的查询条件,这时后面的条件需要一个参数列表。
我们期待可以根据数据列表[1,3,5],动态生成多个参数,即@Parameter1=1,@Parameter2=3,@Parameter3=5。
我们可以写一个扩展方法实现它:
public static class SqlCommandExtensions
{
public static void AddArrayParameters<T>(this SqlCommand cmd, string name, IEnumerable<T> values)
{
name = name.StartsWith("@") ? name : "@" + name;
var names = string.Join(", ", values.Select((value, i) =>
{
var paramName = name + i;
cmd.Parameters.AddWithValue(paramName, value);
return paramName;
}));
cmd.CommandText = cmd.CommandText.Replace(name, names);
}
}
如何使用它:
var ageList = new List<int> { 1, 3, 5, 7, 9, 11 };
var cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM MyTable WHERE Age IN (@Age)";
cmd.AddArrayParameters("Age", ageList);
//查看结果
foreach (SqlParameter parameter in cmd.Parameters)
{
Console.WriteLine($"{parameter.ParameterName},{parameter.Value}");
}
Console.WriteLine(cmd.CommandText);
执行``后,得到SQL:
SELECT * FROM MyTable WHERE Age IN (@Age0, @Age1, @Age2, @Age3, @Age4, @Age5)
并且Parameters添加了@Age0, @Age1, @Age2, @Age3, @Age4, @Age5共6个参数。
示例代码
SqlCommandExtensionsAddParameterArrayToSqlCommandDemo
参考资料
Pass Array Parameter in SqlCommand
学习技术最好的文档就是【官方文档】,没有之一。
还有学习资料【Microsoft Learn】、【CSharp Learn】、【My Note】。
如果,你希望更容易地发现我的新博客,不妨点击一下【关注】。