我试图将一个Array传递给一个方法然后返回一个我可以用于SQL WHERE子句的字符串。我有以下,它工作得很好。但有更好的方法吗?我正在寻找两个结果中的一个;
WHERE (ColumnName IN (12, 34, 56, 78, 90))
WHERE (ColumnName IN ('12', '34', '56', '78', '90'))
public static string setInSearchFilter(string psSearchFilter, string psColumnName,
string[] paObjectValues, bool pbIsString)
{
string lsDelimiter = "'", lsRetVal = string.Empty, lsObjectValues = string.Empty;
if (!pbIsString)
{
lsDelimiter = string.Empty;
}
if (!string.IsNullOrEmpty(psSearchFilter))
{
lsRetVal = psSearchFilter + " AND ";
}
for (int i = 0; i <= paObjectValues.GetUpperBound(0); i++)
{
lsObjectValues += lsDelimiter + paObjectValues[i] + lsDelimiter;
if (i < paObjectValues.GetUpperBound(0))
{
lsObjectValues += ", ";
}
}
return lsRetVal += "(" + psColumnName + " IN (" + lsObjectValues + "))";
}
答案 0 :(得分:1)
我会为每个选项添加参数(允许查询计划重用和注入安全),或者我会调查“拆分”UDF。或者,更好的是,我会使用像ORM或微型ORM这样的东西,它们通常可以内置这种类型的功能。例如,使用LINQ,你经常可以使用数组/列表和Contains。或者使用“dapper”,您可以使用IN语法的细微变体,将输入扩展为单独的参数 - 具体来说:如果“bar”参数有3个值,则where x.Foo in @bar
变为where x,Foo in (@bar0, @bar1, @bar2)
。
答案 1 :(得分:1)
正如评论中所建议的,string.Join
:
string.Format(
"({0}" + string.Join("{0},{0}", paObjectValues) + "{0})",
lsDelimiter
);
这假定列表中有某些内容,因此如果过滤器集为空,请确保抛出或返回。
您可能还会考虑对项目进行某种验证以防止SQL注入:
if (paObjectValues.Any(item => !int.TryParse(item)))
throw new Exception("Items must be numeric");