我正在尝试使用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(")");
}
我需要测试该项目是否是循环中的最后一项,以便它不会在结束“”之前放入“,”。
我该怎么做?或者如果有更好的方法来构建这部分查询请建议,我还在学习,我们都必须从某个地方开始! :)
最终这将是对零件搜索的查询。
提前致谢
答案 0 :(得分:4)
这样做有很多方法。
您可以使用string.TrimEnd从字符串中删除额外的逗号,也可以使用string.Join创建新字符串,例如
string InPartQuery = string.Join(",", lstSalesGroup.Items
.Cast<ListItem>()
.Where(t => t.Selected)
.Select(r => "'" + r.Value + "'"));
答案 1 :(得分:1)
您可以将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)));
}
答案 2 :(得分:1)
尝试使用linq
selectQuery.Append("AND SALES_GROUP IN (");
selectQuery.Append(string.Join(",", lstSalesGroup.Items.Select(i => "'" + i.Value + "'")));
selectQuery.Append(")");
这将解决您的问题,但您在此处遇到SQL注入问题。我强烈建议您在查询中使用参数。
答案 3 :(得分:0)
试试这个:
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(")");
}
查看this示例,了解有关.Aggragate(...)
方法
答案 4 :(得分:0)
Dim s As String = "'"
For i = 0 To ListBox1.Items.Count - 1
s = s & ListBox1.Items.Item(i) & "','"
Next