You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将List<int>集合的值填充到SQL查询的IN()子句中?

嘿,这个问题我太熟了——你之前尝试的字符串拼接方法虽然看起来能快速凑出SQL,但绝对要避开,因为这会给SQL注入留后门,而且如果集合里有特殊值或者空元素,还容易触发语法错误。下面给你两种安全又靠谱的方案:

方案1:安全的参数化查询(ADO.NET原生实现)

这是最稳妥的原生做法,通过给集合里的每个元素创建独立参数,动态生成参数化SQL,完全杜绝SQL注入风险:

List<int> ls = new List<int> {5,7,9,11};
// 初始化SQL语句,准备拼接参数占位符
string sql = "SELECT Id1 FROM T WHERE Id2 IN (";
var parameters = new List<SqlParameter>();

// 为每个集合元素生成参数和占位符
for (int i = 0; i < ls.Count; i++)
{
    string paramName = $"@p{i}";
    sql += paramName;
    // 如果不是最后一个元素,添加逗号分隔
    if (i < ls.Count - 1)
        sql += ", ";
    // 将参数和对应值加入参数列表
    parameters.Add(new SqlParameter(paramName, ls[i]));
}
sql += ")";

// 执行查询
using (SqlConnection conn = new SqlConnection("你的数据库连接字符串"))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand(sql, conn))
    {
        cmd.Parameters.AddRange(parameters.ToArray());
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            // 读取并处理查询结果
            while (reader.Read())
            {
                int id1 = reader.GetInt32(0);
                // 这里写你需要的业务逻辑
            }
        }
    }
}
方案2:用Entity Framework(ORM简化实现)

如果你项目里用了Entity Framework(EF Core或EF6),那代码会更简洁——LINQ会自动帮你生成参数化的IN查询,完全不用手动拼接SQL:

List<int> ls = new List<int> {5,7,9,11};
using (var dbContext = new YourDbContext()) // 替换成你的DbContext类
{
    var id1List = dbContext.T
                          .Where(t => ls.Contains(t.Id2))
                          .Select(t => t.Id1)
                          .ToList();
    // id1List就是你要的结果集合
}

为什么不推荐字符串拼接?

举个极端例子:如果你的集合值来自用户输入,恶意用户可能输入1); DROP TABLE T;--,直接拼接后SQL会变成SELECT Id1 FROM T WHERE Id2 IN (1); DROP TABLE T;--),这会直接删除你的T表——这就是SQL注入的危害,所以绝对不能用字符串拼接的方式处理这类查询。

内容的提问来源于stack exchange,提问作者Harshil Doshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:02:56