有没有更好的方法将数组拆分为字符串

时间:2012-11-06 21:15:55

标签: c#

我试图将一个Array传递给一个方法然后返回一个我可以用于SQL WHERE子句的字符串。我有以下,它工作得很好。但有更好的方法吗?我正在寻找两个结果中的一个;

  1. WHERE (ColumnName IN (12, 34, 56, 78, 90))
  2. WHERE (ColumnName IN ('12', '34', '56', '78', '90'))

  3.     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 + "))";
        }
    

2 个答案:

答案 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");