【问题标题】:How to combine multiple INSERT INTO's with prepared statements?如何将多个 INSERT INTO 与准备好的语句结合起来?
【发布时间】:2022-01-06 23:26:29
【问题描述】:

使用 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] });
        }

【问题讨论】:

    标签: c# sql dapper


    【解决方案1】:

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

    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);
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多