FreeSql(f)に一括挿入データ

var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + 
    "Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10";

IFreeSql fsql = new FreeSql.FreeSqlBuilder()
    .UseConnectionString(FreeSql.DataType.MySql, connstr)
    .UseAutoSyncStructure(true) //自动同步实体结构到数据库
    .Build();

[Table(Name = "tb_topic")]
class Topic {
    [Column(IsIdentity = true, IsPrimary = true)]
    public int Id { get; set; }
    public int Clicks { get; set; }
    public string Title { get; set; }
    public DateTime CreateTime { get; set; }
}

一括挿入

var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });

fsql.Insert<Topic>(items).ExecuteAffrows();

次のようにSQLを実行します。

INSERT INTO `tb_topic`(`Clicks`, `Title`, `CreateTime`) 
VALUES(?Clicks0, ?Title0, ?CreateTime0), 
(?Clicks1, ?Title1, ?CreateTime1), 
(?Clicks2, ?Title2, ?CreateTime2), 
(?Clicks3, ?Title3, ?CreateTime3), 
(?Clicks4, ?Title4, ?CreateTime4), 
(?Clicks5, ?Title5, ?CreateTime5), 
(?Clicks6, ?Title6, ?CreateTime6), 
(?Clicks7, ?Title7, ?CreateTime7), 
(?Clicks8, ?Title8, ?CreateTime8), 
(?Clicks9, ?Title9, ?CreateTime9)

内装

大容量データに挿入されたとき、内部使用分割ロジックは、バッチ式で行われます。次のようにセグメンテーションルールは以下のとおりです。

数量 パラメータの量
MySQLの 5000 3000
PostgreSQLの 5000 3000
SQLサーバー 1000年 2100
オラクル 500 999
sqliteの 5000 999

データ:バルクデータ挿入10000として各バッチの大きさを、分割は、実行は、MySQLは、二つのバッチに分割される時。
パラメータ量:量は、バルクデータ挿入10000としてバッチ分割パラメータは、分割を各バッチのMySQL 5分の3000を実行する際に必要な5つのパラメータの各行のサイズです。

セグメンテーションを実行した後、トランザクションが開いてから内部トランザクションの外側に設けられていないときに挿入の整合性を実現しています。

FreeSql適合パラメトリック各データ・タイプ、及びノンパラメトリック使用。バルクは、パラメトリック機能の提案閉鎖を挿入し、.NonoParameter()の実行(今後の記事で取り上げに関するNoneParameter)を使用します。

パフォーマンスリファレンス

API

方法 返却値 パラメータ 説明
AppendData <この> T1 | IEnumerableを 挿入のために意図され、追加のエンティティ
ToSql 実行するSQL文を返します。
ExecuteAffrows 長いです SQL文を実行する行数、リターンの影響
ExecuteIdentity 長いです 付加価値から返すSQL文を実行
ExecuteInserted 一覧<T1> レコードの挿入が返された後、SQL文を実行

おすすめ

転載: www.cnblogs.com/FreeSql/p/11531309.html