根据asp.net中的列表值选择Query with Where条件

时间:2014-10-20 08:52:53

标签: c# sql asp.net sql-server sql-server-2008

我有一个sql表。我在我的Asp.Net代码(C#)中也有一个列表。

public static List listColumns = new List();

listColumns随机包含1,2,3 ... 10。例如,它可以包含1,5,6,9。我想用这个条件进行查询。所以,如果列表有这些值,我的查询应该是:

SELECT * FROM Table WHERE id=1 or id=5 or id=6 or id=9

listColumns可能包含不同的值,并且具有不同的计数。我该如何定期进行此查询?

4 个答案:

答案 0 :(得分:2)

//assume input is List of integers 
List<int> ids = new List<int> { 1,5,6,9 };
//build your SQL statement as below
string cmdText = "SELECT * FROM Table  WHERE id IN ({0})";
// add parameters for each id value 
string[] paramNames = ids.Select(
    (s, i) => "@id" + i.ToString()
).ToArray();

string inClause = string.Join(",", paramNames);
//set the parameter values
using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) {
    for(int i = 0; i < ids.Count; i++) {
       cmd.Parameters.AddWithValue(paramNames[i], ids[i]);
    }
}

答案 1 :(得分:2)

 //assume a list of int value name listColumns
  var listColumns = new List<int>() { 1, 5, 9 };
  var sb = new StringBuilder();
  sb.Append("SELECT * FROM Table");

   for (int i = 0; i < listColumns.Count; i++)
   {
       if (i == 0)
          {
             sb.Append(" where ");
             sb.Append(" id=" + listColumns[i]);
          }
        else
             sb.Append(" or id=" + listColumns[i]);
    }
   Console.Write(sb.ToString());

将查询变量传递给sqlcommand

答案 2 :(得分:2)

这是一个没有for循环的解决方案,但遗憾的是没有参数化的SQL语句:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

public class test {
  public static void Main(string[] args)
  {
    //List<int> listColumns = new List<int>(){ 1, 5, 6, 9};
    System.Collections.Generic.List<int> listColumns = new System.Collections.Generic.List<int>(){ 1, 5, 6, 9};
    string s = String.Join(", ", listColumns.Select(x => x.ToString()));

    string sql = String.Format("SELECT * FROM Table WHERE ID IN ({0})", s);
    Console.WriteLine(sql);
  }
}

请注意,使用select *被视为不良做法

修改以下是一些新代码,因为您的列表类型为System.Web.UI.MobileControls.List

string sql = String.Format("SELECT * FROM Table WHERE ID IN ({0})", 
                 listColumns.ListItem.Value);

编辑2 我已从您的评论中获取代码:

list.Items.Clear(); 
string values = DropDownList4.SelectedValue; 
string[] words = values.Split(','); 

foreach (string s in words) 
    if (s != "" && s != string.Empty && s != null)     
        list.Items.Add(s);

我猜你在下拉列表更改事件上有这个吗?你的下拉列表中有一个类似“1,5,6,9”的字符串。 如果我的所有假设都是正确的,您可以使用:

System.Collections.Generic.List<int> selectedValues = new     System.Collections.Generic.List<int>();

foreach (string s in words)
    if (!String.IsNullOrWhiteSpace(s))
        selectedValues.Add(Convert.ToInt32(s));
string ids = String.Join(", ", selectedValues.Select(x => x.ToString()));
string sql = String.Format("SELECT * FROM Table WHERE ID IN ({0})", ids);

答案 3 :(得分:0)

LINQ到SQL:

var listColumns = new List<int>() { 1, 5, 6, 9 };
db.Table.Where(x => listColumns.Distinct().Contains(x.id)).ToString();

生成的SQL:

SELECT
    [Extent1].[id] AS [id],
FROM [Table] AS [Extent1]
WHERE [Extent1].[id] IN (1, 5, 6, 9)

修改

一种产生参数化SQL的方法(如果参数数量不断变化,那么它就非常有用):

listColumns.Distinct().Aggregate(db.Table, (current, c) => current.Where(x => c == x.id)).ToString();