FreeSql(XIV)一括更新データ

FreeSqlは、豊富なデータ更新方法をサポートする単一またはバッチ更新をサポートし、あなたも実行するために、特定のデータベースに記録更新した値を返すことができます。

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.Update<Topic>().SetSource(items).ExecuteAffrows();
//UPDATE `tb_topic` SET `Clicks` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END, `Title` = CASE `Id` WHEN 1 THEN ?p_10 WHEN 2 THEN ?p_11 WHEN 3 THEN ?p_12 WHEN 4 THEN ?p_13 WHEN 5 THEN ?p_14 WHEN 6 THEN ?p_15 WHEN 7 THEN ?p_16 WHEN 8 THEN ?p_17 WHEN 9 THEN ?p_18 WHEN 10 THEN ?p_19 END, `CreateTime` = CASE `Id` WHEN 1 THEN ?p_20 WHEN 2 THEN ?p_21 WHEN 3 THEN ?p_22 WHEN 4 THEN ?p_23 WHEN 5 THEN ?p_24 WHEN 6 THEN ?p_25 WHEN 7 THEN ?p_26 WHEN 8 THEN ?p_27 WHEN 9 THEN ?p_28 WHEN 10 THEN ?p_29 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))

値の非常に複雑な一連のローカルルールに従ってバッチ更新のシーン、最初のチェック20枚のレコードは、後に変更しました

伝統的な練習は、ライン上で時に一度だけの場合と、20サイクルを節約することです

バッチ更新は、いくつかの列を無視します

fsql.Update<Topic>().SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ExecuteAffrows();
//UPDATE `tb_topic` SET `Title` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))

バッチは、指定された列を更新します

fsql.Update<Topic>().SetSource(items).Set(a => a.CreateTime, DateTime.Now).ExecuteAffrows();
//UPDATE `tb_topic` SET `CreateTime` = ?p_0 WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))

指定された列を更新した後、バッチを保存失敗します

内部

データ更新大量の場合、内部ロジックセグメンテーションはバッチ式で行われます。次のようにセグメンテーションルールは以下のとおりです。

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

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

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

FreeSql適合パラメトリック各データ・タイプ、及びノンパラメトリック使用。バルクはパラメトリック関数の提案閉鎖を挿入し、実行のため.NonoParameter()を使用します。

API

方法 返却値 パラメータ 説明
SetSource <この> T1 | IEnumerableを データを更新し、更新されたエンティティを設定します
IgnoreColumns <この> ラムダ 列を無視
セットする <この> ラムダ、値 新しい値の列を設定し、セット(=> a.Name、 "NEWVALUE")
セットする <この> ラムダ クリック=クリック+ 1に対応し、新たな上昇に基づいて、列の値が、セット(A => a.Clicks + 1)を設定します。
SetRaw <この> 文字列、PARMS 設定した値、カスタムSQL構文、SetRaw( "タイトル=?タイトル"、新しい{タイトル= "newTitleの"})
どこ <この> ラムダ 発現条件、支持部材への唯一の物理インフラ(ナビゲーションオブジェクトが含まれていません)
どこ <この> 文字列、PARMS SQL構文ネイティブ条件( "ID = ID"、新しい{ID = 1})
どこ <この> T1 | IEnumerableを 受信エンティティまたはその主キーに条件として設定
WhereExists <この> ISelect サブクエリの存在
WithTransaction <この> DbTransaction 設定したトランザクションオブジェクト
ToSql 実行するSQL文を返します。
ExecuteAffrows 長いです SQL文を実行する行数、リターンの影響
ExecuteUpdated 一覧<T1> SQL文を実行し、更新されたレコードを返します。

おすすめ

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