日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FreeSql (十四)批量更新数据

發(fā)布時間:2023/12/18 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FreeSql (十四)批量更新数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

FreeSql支持豐富的更新數(shù)據(jù)方法,支持單條或批量更新,在特定的數(shù)據(jù)庫執(zhí)行還可以返回更新后的記錄值。

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) //自動同步實體結(jié)構到數(shù)據(jù)庫.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條記錄,根據(jù)本地很復雜的規(guī)則把集合的值改完后

傳統(tǒng)做法是循環(huán)20次保存,用 case when 只要一次就行

批量更新,忽略一些列

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

指定列更新后,批量保存將失效

內(nèi)部實現(xiàn)

當更新大批量數(shù)據(jù)時,內(nèi)部采用分割分批執(zhí)行的邏輯進行。分割規(guī)則如下:

數(shù)量參數(shù)量
MySql50003000
PostgreSQL50003000
SqlServer10002100
Oracle500999
Sqlite5000999

數(shù)據(jù):為每批分割的大小,如批量插入 10000 條數(shù)據(jù),在 mysql 執(zhí)行時會分割為兩批。
參數(shù)量:為每批分割的參數(shù)量大小,如批量插入 10000 條數(shù)據(jù),每行需要使用 5 個參數(shù)化,在 mysql 執(zhí)行時會分割為每批 3000 / 5。

分割執(zhí)行后,當外部未提供事務時,內(nèi)部自開事務,實現(xiàn)插入完整性。

FreeSql 適配了每一種數(shù)據(jù)類型參數(shù)化,和不參數(shù)化的使用。批量插入建議關閉參數(shù)化功能,使用 .NonoParameter() 進行執(zhí)行。

API

方法返回值參數(shù)描述
SetSource<this>T1 | IEnumerable更新數(shù)據(jù),設置更新的實體
IgnoreColumns<this>Lambda忽略的列
Set<this>Lambda, value設置列的新值,Set(a => a.Name, "newvalue")
Set<this>Lambda設置列的的新值為基礎上增加,Set(a => a.Clicks + 1),相當于 clicks=clicks+1;
SetRaw<this>string, parms設置值,自定義SQL語法,SetRaw("title = ?title", new { title = "newtitle" })
Where<this>Lambda表達式條件,僅支持實體基礎成員(不包含導航對象)
Where<this>string, parms原生sql語法條件,Where("id = ?id", new { id = 1 })
Where<this>T1 | IEnumerable傳入實體或集合,將其主鍵作為條件
WhereExists<this>ISelect子查詢是否存在
WithTransaction<this>DbTransaction設置事務對象
ToSqlstring返回即將執(zhí)行的SQL語句
ExecuteAffrowslong執(zhí)行SQL語句,返回影響的行數(shù)
ExecuteUpdatedList<T1>執(zhí)行SQL語句,返回更新后的記錄

系列文章導航

  • (一)入門

  • (二)自動遷移實體

  • (三)實體特性

  • (四)實體特性 Fluent Api

  • (五)插入數(shù)據(jù)

  • (六)批量插入數(shù)據(jù)

  • (七)插入數(shù)據(jù)時忽略列

  • (八)插入數(shù)據(jù)時指定列

  • (九)刪除數(shù)據(jù)

  • (十)更新數(shù)據(jù)

  • (十一)更新數(shù)據(jù) Where

  • (十二)更新數(shù)據(jù)時指定列

  • (十三)更新數(shù)據(jù)時忽略列

  • (十四)批量更新數(shù)據(jù)

  • (十五)查詢數(shù)據(jù)

  • (十六)分頁查詢

  • (十七)聯(lián)表查詢

  • (十八)導航屬性

  • (十九)多表查詢

  • (二十)多表查詢 WhereCascade

  • (二十一)查詢返回數(shù)據(jù)

  • (二十二)Dto 映射查詢

  • (二十三)分組、聚合

  • (二十四)Linq To Sql 語法使用介紹

  • (二十五)延時加載

  • (二十六)貪婪加載 Include、IncludeMany、Dto、ToList

  • (二十七)將已寫好的 SQL 語句,與實體類映射進行二次查詢

  • (二十八)事務

  • (二十九)Lambda 表達式

  • (三十)讀寫分離

  • (三十一)分區(qū)分表

  • (三十二)Aop

  • (三十三)CodeFirst 類型映射

  • (三十四)CodeFirst 遷移說明

  • (三十五)CodeFirst 自定義特性

轉(zhuǎn)載于:https://www.cnblogs.com/FreeSql/p/11531335.html

總結(jié)

以上是生活随笔為你收集整理的FreeSql (十四)批量更新数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。