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

如何使用Dapper将多条INSERT INTO预编译语句合并为单条查询?

问题解答

完全可以,下面给两种常用实现方案:

方案1:Dapper原生批量参数执行(写法最简单)

Dapper的Execute方法原生支持传入可枚举类型的参数集合,会自动迭代执行SQL语句,无需手动循环拼接每次的参数,兼容所有支持Dapper的数据库类型。
代码示例:

public static void LinkUsersToChatroom(int chatroomId, int[] userIds)
{
    using SqlConnection connection = new(connectionString);
    connection.Execute(
        "INSERT INTO chatroom_users (chatroomId, userId) VALUES (@chatroomId, @userId)",
        // 把userId数组转为对应参数的匿名类集合
        userIds.Select(id => new { chatroomId, userId = id })
    );
}

方案2:单条INSERT批量插入(性能最优)

如果要实现真正的单条数据库查询、减少网络交互开销,可以动态拼接SQL的VALUES子句,一次性插入所有数据,适合userIds长度不超过数据库参数上限(SQL Server默认参数上限为2100)的场景。
代码示例:

using Dapper; // 需要引入DynamicParameters的命名空间

public static void LinkUsersToChatroom(int chatroomId, int[] userIds)
{
    // 空数组直接返回,避免生成无效SQL
    if (userIds == null || userIds.Length == 0) return;
    
    using SqlConnection connection = new(connectionString);
    var parameters = new DynamicParameters();
    parameters.Add("@chatroomId", chatroomId);
    var valueParts = new List<string>();

    for (int i = 0; i < userIds.Length; i++)
    {
        var paramName = $"@userId{i}";
        valueParts.Add($"(@chatroomId, {paramName})");
        parameters.Add(paramName, userIds[i]);
    }

    var insertSql = $"INSERT INTO chatroom_users (chatroomId, userId) VALUES {string.Join(",", valueParts)}";
    connection.Execute(insertSql, parameters);
}

补充说明

如果单次插入的用户量极大(超过数千级别),推荐使用数据库专属的批量导入方案(比如SQL Server的SqlBulkCopy),性能会比普通INSERT更高。

内容的提问来源于stack exchange,提问作者Thimo Reumerman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:24:03