如何将多个 INSERT INTO 与准备好的语句结合起来?

How to combine multiple INSERT INTO's with prepared statements?

使用 Dapper,有没有办法用准备好的语句将其形成一个查询? userIds的长度是动态的。

        public static void LinkUsersToChatroom(int chatroomId, int[] userIds)
        {
            using SqlConnection connection = new(connectionString);

            connection.Execute(
            "INSERT INTO chatroom_users (chatroomId, userId) VALUES (@chatroomId, @userId)",
                new { chatroomId, userId = userIds[0] });

            connection.Execute(
            "INSERT INTO chatroom_users (chatroomId, userId) VALUES (@chatroomId, @userId)",
                new { chatroomId, userId = userIds[1] });

            connection.Execute(
            "INSERT INTO chatroom_users (chatroomId, userId) VALUES (@chatroomId, @userId)",
                new { chatroomId, userId = userIds[2] });
        }

Dapper 优于直接 ADO.NET 的众多优点之一是将数据列表插入 table.
的简单性 您只需要一个 class <T> 的列表,其中 class 的属性与您的数据库字段具有相同的名称,所以...

private class ChatRoomUser
{
    public int chatroomId {get;set;}
    public int userId {get;set;}
}

public static void LinkUsersToChatroom(int chatroomId, int[] userIds)
{
    //Transform the array in an IEnumerable of ChatRoomUser
    var users = userIds.Select(x => new ChatRoomUser
    { 
        chatroomId = chatroomId, 
        userIds = x
    };
    using SqlConnection connection = new(connectionString);
    connection.Execute(@"INSERT INTO chatroom_users (chatroomId, userId)  
                         VALUES (@chatroomId, @userId)", 
                         users);

}

如果您想维护当前方法的实际接口,您可以使用这种方法,但是,当然,没有什么能阻止您直接在构建数组的地方构建列表并传递列表而不是两个参数甚至创建此方法的重载以接受列表作为其输入。