FreeSql (十四)批量更新数据
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ī)則如下:
| MySql | 5000 | 3000 |
| PostgreSQL | 5000 | 3000 |
| SqlServer | 1000 | 2100 |
| Oracle | 500 | 999 |
| Sqlite | 5000 | 999 |
數(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
| 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 | 設置事務對象 |
| ToSql | string | 返回即將執(zhí)行的SQL語句 | |
| ExecuteAffrows | long | 執(zhí)行SQL語句,返回影響的行數(shù) | |
| ExecuteUpdated | List<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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 下开发PHP扩展资源
- 下一篇: [转载]QQ空间技术架构之深刻揭密