使用多个过滤器搜索 SQL 个数据库

Search SQL database with multiple filters

我有以下代码:

List<string> L1 = new List<string>();
int Id = 1;

using (SqlConnection conn = new SqlConnection())
{               
    conn.ConnectionString = "...";
    SqlCommand cmd = conn.CreateCommand();

    cmd.CommandText = "SELECT * FROM categories WHERE category_id = @Id";
    cmd.Parameters.Add(new SqlParameter("@Id", Id));
                                
    conn.Open();
                                
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        category = reader.GetString(1);
        L1.Add(category);
    }
}

这给出了“category_id”等于 1 的行。

我现在想要 SELECT 语句到 return 行,其中“category_id”等于我给它的值之一。

所以一个简单的 SELECT 语句看起来像这样

SELECT * FROM categories WHERE category_id = 1 or category_id = 2
//returns all rows where "category_id" is equal to 1 or 2

问题是在设置 SELECT 语句时我不知道要搜索的值。 我会将值放在字符串、列表或类似的东西中。

我尝试使用 foreach 循环来更改“Id”的值

cmd.Parameters.Add(new SqlParameter("@Id", typeof(int)));
foreach (int val in Values)
{
    cmd.Parameters["@Id"].Value = val;
}

但这只是 return 行,其中“category_id”等于数组“Values”中的最后一个值。

我尝试使用 IN 运算符,但出现错误

cmd.CommandText = "SELECT * FROM categories WHERE category_id IN (@Id)";
cmd.Parameters.Add(new SqlParameter("@Id", Values));
                

我的最后一个想法是使用循环从值中创建一个字符串。

string ValueString = "0";
foreach (int val in Values)
{
    ValueString += ",";
    ValueString += Convert.ToString(val);
}

我还没有尝试过,但我预计它会给出一个错误,因为列“category_id”的数据类型为“int”。

是否有任何方法可以使用 array/list 作为参数搜索 SQL 数据库,因此它会给出等于 array/list 中的值之一的每一行。

您可以为您的命令使用“IN”关键字:

SELECT * FROM categories WHERE category_id IN (1,2)

您的 CommandText 需要如下所示:

 cmd.CommandText = "SELECT * FROM categories WHERE IN (@Id)";

您可以像这样设置参数@ID:

cmd.Parameters.Add(new SqlParameter("@Id", string.Join(",", L1)));

在运行它之前,您只需将“1”和“2”添加到您的 L1-List 即可。

cmd.CommandText = "SELECT * 来自类别(@Id)";

cmd.Parameters.Add(new SqlParameter("@Id", string.Join(",", L1)));

我发现最好的方法是用 array/list.

中的值创建一个连接字符串
string L1Joined = string.Join(",", L1);
//(L1: name of the array/list)

然后使用“IN”关键字并使 CommandText 成为格式化字符串。

所以 CommandText 看起来像这样:

cmd.CommandText = $"SELECT * FROM categories WHERE category_id IN ({L1Joined})";

不确定这是否是最有效的方法,但它适用于我的特定问题。