FreeSql支持豐富的更新數(shù)據(jù)方法,支持單條或批量更新,在特定的數(shù)據(jù)庫(kù)執(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) //自動(dòng)同步實(shí)體結(jié)構(gòu)到數(shù)據(jù)庫(kù) .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))
批量更新的場(chǎng)景,先查詢20條記錄,根據(jù)本地很復(fù)雜的規(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)部實(shí)現(xiàn)
當(dāng)更新大批量數(shù)據(jù)時(shí),內(nèi)部采用分割分批執(zhí)行的邏輯進(jìn)行。分割規(guī)則如下:
數(shù)量 參數(shù)量
MySql 5000 3000
PostgreSQL 5000 3000
SqlServer 1000 2100
Oracle 500 999
Sqlite 5000 999
數(shù)據(jù):為每批分割的大小,如批量插入 10000 條數(shù)據(jù),在 mysql 執(zhí)行時(shí)會(huì)分割為兩批。
參數(shù)量:為每批分割的參數(shù)量大小,如批量插入 10000 條數(shù)據(jù),每行需要使用 5 個(gè)參數(shù)化,在 mysql 執(zhí)行時(shí)會(huì)分割為每批 3000 / 5。
分割執(zhí)行后,當(dāng)外部未提供事務(wù)時(shí),內(nèi)部自開(kāi)事務(wù),實(shí)現(xiàn)插入完整性。
FreeSql 適配了每一種數(shù)據(jù)類型參數(shù)化,和不參數(shù)化的使用。批量插入建議關(guān)閉參數(shù)化功能,使用 .NonoParameter() 進(jìn)行執(zhí)行。
API
方法 返回值 參數(shù) 描述
SetSource <this> T1 | IEnumerable 更新數(shù)據(jù),設(shè)置更新的實(shí)體
IgnoreColumns <this> Lambda 忽略的列
Set <this> Lambda, value 設(shè)置列的新值,Set(a => a.Name, "newvalue")
Set <this> Lambda 設(shè)置列的的新值為基礎(chǔ)上增加,Set(a => a.Clicks + 1),相當(dāng)于 clicks=clicks+1;
SetRaw <this> string, parms 設(shè)置值,自定義SQL語(yǔ)法,SetRaw("title = ?title", new { title
= "newtitle" })
Where <this> Lambda 表達(dá)式條件,僅支持實(shí)體基礎(chǔ)成員(不包含導(dǎo)航對(duì)象)
Where <this> string, parms 原生sql語(yǔ)法條件,Where("id = ?id", new { id = 1 })
Where <this> T1 | IEnumerable 傳入實(shí)體或集合,將其主鍵作為條件
WhereExists <this> ISelect 子查詢是否存在
WithTransaction <this> DbTransaction 設(shè)置事務(wù)對(duì)象
ToSql string 返回即將執(zhí)行的SQL語(yǔ)句
ExecuteAffrows long 執(zhí)行SQL語(yǔ)句,返回影響的行數(shù)
ExecuteUpdated List<T1> 執(zhí)行SQL語(yǔ)句,返回更新后的記錄
系列文章導(dǎo)航
*
(一)入門(mén) <https://www.cnblogs.com/FreeSql/p/11531300.html>
*
(二)自動(dòng)遷移實(shí)體 <https://www.cnblogs.com/FreeSql/p/11531301.html>
*
(三)實(shí)體特性 <https://www.cnblogs.com/FreeSql/p/11531302.html>
*
(四)實(shí)體特性 Fluent Api <https://www.cnblogs.com/FreeSql/p/11531304.html>
*
(五)插入數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531306.html>
*
(六)批量插入數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531309.html>
*
(七)插入數(shù)據(jù)時(shí)忽略列 <https://www.cnblogs.com/FreeSql/p/11531316.html>
*
(八)插入數(shù)據(jù)時(shí)指定列 <https://www.cnblogs.com/FreeSql/p/11531318.html>
*
(九)刪除數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531320.html>
*
(十)更新數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531321.html>
*
(十一)更新數(shù)據(jù) Where <https://www.cnblogs.com/FreeSql/p/11531324.html>
*
(十二)更新數(shù)據(jù)時(shí)指定列 <https://www.cnblogs.com/FreeSql/p/11531327.html>
*
(十三)更新數(shù)據(jù)時(shí)忽略列 <https://www.cnblogs.com/FreeSql/p/11531334.html>
*
(十四)批量更新數(shù)據(jù)
*
(十五)查詢數(shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531339.html>
*
(十六)分頁(yè)查詢 <https://www.cnblogs.com/FreeSql/p/11531341.html>
*
(十七)聯(lián)表查詢 <https://www.cnblogs.com/FreeSql/p/11531346.html>
*
(十八)導(dǎo)航屬性 <https://www.cnblogs.com/FreeSql/p/11531352.html>
*
(十九)多表查詢 <https://www.cnblogs.com/FreeSql/p/11531362.html>
*
(二十)多表查詢 WhereCascade <https://www.cnblogs.com/FreeSql/p/11531372.html>
*
(二十一)查詢返回?cái)?shù)據(jù) <https://www.cnblogs.com/FreeSql/p/11531376.html>
*
(二十二)Dto 映射查詢 <https://www.cnblogs.com/FreeSql/p/11531381.html>
*
(二十三)分組、聚合 <https://www.cnblogs.com/FreeSql/p/11531384.html>
*
(二十四)Linq To Sql 語(yǔ)法使用介紹 <https://www.cnblogs.com/FreeSql/p/11531392.html>
*
(二十五)延時(shí)加載 <https://www.cnblogs.com/FreeSql/p/11531395.html>
*
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
<https://www.cnblogs.com/FreeSql/p/11531404.html>
*
(二十七)將已寫(xiě)好的 SQL 語(yǔ)句,與實(shí)體類映射進(jìn)行二次查詢
<https://www.cnblogs.com/FreeSql/p/11531416.html>
*
(二十八)事務(wù) <https://www.cnblogs.com/FreeSql/p/11531423.html>
*
(二十九)Lambda 表達(dá)式 <https://www.cnblogs.com/FreeSql/p/11531425.html>
*
(三十)讀寫(xiě)分離 <https://www.cnblogs.com/FreeSql/p/11531430.html>
*
(三十一)分區(qū)分表 <https://www.cnblogs.com/FreeSql/p/11531435.html>
*
(三十二)Aop <https://www.cnblogs.com/FreeSql/p/11531471.html>
*
(三十三)CodeFirst 類型映射 <https://www.cnblogs.com/FreeSql/p/11531543.html>
*
(三十四)CodeFirst 遷移說(shuō)明 <https://www.cnblogs.com/FreeSql/p/11531550.html>
*
(三十五)CodeFirst 自定義特性 <https://www.cnblogs.com/FreeSql/p/11531576.html>
熱門(mén)工具 換一換
