我试图使用StringBuilder
建立一个SQL查询,我已经成为卡住试图做WHERE
子句的一部分。
我有一个列表框的一堆值,并允许多次选择。我需要迭代选定的项目,并将其放在IN
语句中,如…
WHERE SOME_FIELD IN ('Value','NextValue','AnotherValue')
到目前为止,我写的代码是这样的…
if (lstSalesGroup.SelectedItem != null)
{
selectQuery.Append("AND SALES_GROUP IN (");
foreach (ListItem item in lstSalesGroup.Items)
{
if (item.Selected)
selectQuery.Append("'" + item.Value + "',");
}
selectQuery.Append(")");
}
我需要测试项目是否是循环中的最后一个,这样它就不会在结束的")"之前加上","。
我该怎么做?或者如果有更好的方法来构建这部分查询,请建议,我还在学习,我们都必须从某个地方开始!:)
最终这将是一个零件搜索的查询。
Thanks in advance
有两种方法。
可以使用string。TrimEnd从字符串中删除额外的逗号,或者您可以使用string创建一个新字符串。加入像
string InPartQuery = string.Join(",", lstSalesGroup.Items
.Cast<ListItem>()
.Where(t => t.Selected)
.Select(r => "'" + r.Value + "'"));
您可以使用String.Join
和Linq
为清楚起见,我把代码放在变量中。
if (lstSalesGroup.SelectedItem != null)
{
var queryStr = "AND SALES_GROUP IN ({0})";
var selectedItemValues = (from itm in lstSalesGroup.Items.Cast<ListItem>()
where itm.Selected
select String.Format("'{0}'", itm));
selectQuery.Append(String.Format(queryStr, String.Join(",", selectedItemValues)));
}
尝试使用linq
selectQuery.Append("AND SALES_GROUP IN (");
selectQuery.Append(string.Join(",", lstSalesGroup.Items.Select(i => "'" + i.Value + "'")));
selectQuery.Append(")");
这将解决您的问题,但是您在这里遇到SQL注入的问题。我强烈建议您在查询中使用参数
Dim s As String = "'"
For i = 0 To ListBox1.Items.Count - 1
s = s & ListBox1.Items.Item(i) & "','"
Next
试试这个:
if (lstSalesGroup.SelectedItem != null)
{
selectQuery.Append("AND SALES_GROUP IN (");
var local = lstSalesGroup.Items.Where(c => c.Selected)
.Select(c => "'"+c.Value+"'")
.Aggregate((c,n) => c+ ", "+n);
selectQuery.Append(local);
selectQuery.Append(")");
}
关于.Aggragate(...)
方法的更多信息请看这个例子