web-dev-qa-db-ja.com

dapper.NET C#を使用してリストを挿入する

SQLテーブルにオブジェクトのリストを挿入したいのですが。

この質問は知っています ここ ですが、わかりません。

これが私のクラスです:

public class MyObject 
{
    public int? ID { get; set; }
    public string ObjectType { get; set; }
    public string Content { get; set; }
    public string PreviewContent { get; set; }

    public static void SaveList(List<MyObject> lst)
    {
        using (DBConnection connection = new DBConnection())
        {
            if (connection.Connection.State != ConnectionState.Open)
                connection.Connection.Open();

            connection.Connection.Execute("INSERT INTO [MyObject] VALUE()",lst);                
        }
    }
}

Dapperを使用してリストを挿入する方法を知りたいのですが、リストを繰り返し処理して1つずつ保存したくないので、1つのリクエストにすべてを挿入したいと思います。

7

単一の行を挿入するのと同じように、これらを挿入できます。

public class MyObject 
{
    public int? ID { get; set; }
    public string ObjectType { get; set; }
    public string Content { get; set; }
    public string PreviewContent { get; set; }

    public static void SaveList(List<MyObject> lst)
    {
        using (DBConnection connection = new DBConnection())
        {
            if (connection.Connection.State != ConnectionState.Open)
                connection.Connection.Open();

            connection.Connection.Execute("INSERT INTO [MyObject] (Id, ObjectType, Content, PreviewContent) VALUES(@Id, @ObjectType, @Content, @PreviewContent)", lst);                
        }
    }
}

DapperはSQLパラメーター(@ Id、@ ObjectType、@ Content、@ PreviewContent)にちなんで名付けられたクラスメンバーを探し、それに応じてバインドします。

13

テーブル値パラメーターを渡す必要があります。
1。 SQLデータベースにテーブルタイプを作成します。
2。 DynamicParametersを作成し、データテーブル(新しい値)を追加します。
3。実行します。

SQL:

CREATE TYPE [dbo].[tvMyObjects] AS TABLE(
    [ID] INT,
    [ObjectType] [varchar](70), /*Length on your table*/
    [Content] [varchar](70), /*Length on your table*/
    [PreviewContent] [varchar](70) /*Length on your table*/
)

C#:

var dynamicParameters = new DynamicParameters();
dynamicParameters.Add("@MyObjects", lst
    .AsTableValuedParameter("dbo.tvMyObjects", new[] 
    {
        "ID" ,
        "ObjectType",
        "Content", 
        "PreviewContent"
    }));

connection.Connection.Execute(@"
    INSERT INTO [MyObject] (Id, ObjectType, Content, PreviewContent) 
    SELECT Id,
           ObjectType,
           Content,
           PreviewContent
    FROM   @MyObjects", dynamicParameters);

詳細: https://www.codeproject.com/Articles/835519/Passing-Table-Valued-Parameters-with-Dapper

1
Daniel Tshuva

SQLを、クラスのプロパティの名前と一致するパラメーターを持つ有効な挿入ステートメントに変更するだけです。

INSERT INTO MyObject VALUES(@Id, @ObjectType, @Content, @PreviewContent)

または、テーブルの列を指定する必要がある場合(たとえば、これらがテーブル内のすべての列ではない場合):

INSERT INTO MyObject (Id, ObjectType, Content, PreviewContent)
VALUES(@Id, @ObjectType, @Content, @PreviewContent)
0
Charles Mager

Dapper.Contrib拡張機能を使用して、コードを簡略化できます。これは数百のレコードでうまく機能することがわかりましたが、非常に大きな挿入の場合は、SqlBulkCopyに切り替えます。同期バージョンは(ご想像のとおり)InsertAsyncではなくInsertです。エンティティの名前がDapperが期待するとおりであることを確認し、主キーIDを持っているか、テーブル名とキーの注釈をエンティティに追加します。

using using Dapper.Contrib.Extensions; //Git

public async Task SaveChangesAsync(IList<MyEntity> myEntityValues)
{
     var conn = new SqlConnection(myconnectionString);
     if(conn.State != ConnectionState.Open)
         conn.Open();
     await conn.InsertAsync(myEntityValues);
     if (conn.State != ConnectionState.Closed)
     {
        conn.Close();
        conn.Dispose();
      }
}
0
Ron