系列文章目錄
🎀🎀🎀 .NET開源 ORM 框架 SqlSugar 系列 🎀🎀🎀
文章目錄
- 系列文章目錄
- 前言 🍃
- 一、實體對象更新
- 1.1 單條與批量
- 1.2 不更新某列
- 1.3 只更新某列
- 1.4 NULL列不更新
- 1.5 無主鍵/指定列
- 1.6 更新添加條件
- 1.7 大數據更新
- 1.8 重新賦值1:list中的值修改
- 1.9 重新賦值2: 列中的值+1
- 二、根據表達式更新(像SQL)
- 2.1 指定多個字段更新
- 2.2 一個字段更新
- 2.3 字段+1更新
- 2.4 Set語法是支持多個的
- 2.5 批量更新IN
- 2.6 表達式無實體更新
- 2.7 表達式分頁更新
- 三、根據字典更新
- 四、根據DataTable更新
- 五、匿名、Object、接口更新
- 六、更多功能
- 6.1 更新主鍵
- 6.2 聯表更新
- 6.3 調用實體內方法
- 6.4 高性能更新
- 6.5 導航更新
- 6.6 默認值(系統時間)
- 🎀🎀🎀 .NET開源 ORM 框架 SqlSugar 系列 🎀🎀🎀
前言 🍃
前面的章節介紹了各種 SqlSugar
各種場景的 查詢 操作,接下來將介紹 SqlSugar
增、刪、改 相關操作。數據庫 插入 數據的方法包括:使用 SQL
插入語句、通過 ORM
框架、使用 批量插入 技術、利用 存儲過程。
一、實體對象更新
所謂按實體對象更新就是:db.Updateable
(參數對象) 有參數的重載。
db.Updateable(實體或者集合).ExecuteCommand()
1.1 單條與批量
根據實體更新需要給實體配置主鍵,參考文檔實體配置:
函數 | 說明 |
---|---|
ExecuteCommand | 返回受影響行數 , update where 如果沒找到那么就會返回 0 |
ExecuteCommandHasChange | 返回bool ,等同于 bool isChange= ExecuteCommand()>0 |
//根據主鍵更新單條 參數 Class
var result= db.Updateable(updateObj).ExecuteCommand();//實體有多少列更新多少列//批量更新參數 List<Class>
var result= db.Updateable(updateObjs).ExecuteCommand();
//分頁更新 5.1.4.129+ 低版本 存在 UpateColumns設置無效
db.Updateable(List<實體>).PageSize(1000).ExecuteCommand() var updateObj=new Class(){Id=1 }; //主鍵要有值
//只更新修改字段 (5.1.4.59支持了批量)
db.Tracking(updateObj);//創建跟蹤
updateObj.Name = "a1" + Guid.NewGuid();//只改修改了name那么只會更新name
db.Updateable(updateObj).ExecuteCommand();//因為每條記錄的列數不一樣,批量數據多性能差,不建議用
//可以清空
db.ClearTracking();//5.1.4.108-preview30+//大數據批量更新 適合列多數據多的更新
db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//聯表更新看標題6.2
1.2 不更新某列
🌰不更新 TestId
和 CreateTime
var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand()//也可以用特性
[SugarColumn(IsOnlyIgnoreUpdate=true)]
public DateTime UpdateDate{get;set;}
1.3 只更新某列
🌰只更新 Name
和 CreateTime
var result=db.Updateable(updateObj).UpdateColumns(it => new { it.Name,it.CreateTime }).ExecuteCommand();
🎯注意:5.1.4.62 版本支持了多個
UpdateColumn
疊加,之前版本不支持。
🌰 追加AOP賦值列 5.1.4.106-preview19+
//例如:AOP修改 Price那么更新的列就是 Price Name Creatime 加了true就追加了一列
var result=db.Updateable(updateObj)
.UpdateColumns(it => new { it.Name,it.CreateTime },true)//true表示追加AOP賦值列
.ExecuteCommand();
1.4 NULL列不更新
🎯注意:高版本支持批量 ,用該方法批量性能差些,因為列不同所以沒必然用批量語法。
//更新忽略null字段
db.Updateable(data).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand();//更新忽略null并且忽略默認值 (比如int默認值是0就不更新)
db.Updateable(data).IgnoreColumns(ignoreAllNullColumns:true,ignoreAllDefaultValue:true).ExecuteCommand();
1.5 無主鍵/指定列
🆚用法同上唯一區別就是用 WhereColumns
指定條件:
var result= db.Updateable(updateObj).WhereColumns(it=>new { it.Id}).ExecuteCommand();//更新單 條根據ID
var result= db.Updateable(updateObjs).WhereColumns(it=>new { it.Id}).ExecuteCommand();//更新集合根據ID by id
可以多列:
WhereColumns(it=>new { it.Id,it.Name}) //條件列不會被更新,只會作為條件
1.6 更新添加條件
🎯注意:單條操作都支持 ,批量只支持部分庫,多庫考慮批量操作不建議用這個方法。
db.Updateable(updateObj).Where(it=>it.Id==1).ExecuteCommand()
//如果是集合操作請更新到5.0.4版本之前版本禁止使用, 并且只有部分庫支持
1.7 大數據更新
👑大數據更新,適合大數據更新,可以處理百萬級, 5.0.4.5+
//大數據更新,適合大數據更新,可以處理百萬級
db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//特色功能:吊打所有框架N倍,30列100萬8秒更新完
1.8 重新賦值1:list中的值修改
//單個字段db.Updateable(updateObj).ReSetValue(it=> { it.Name = it.Name+"a";})//updateObj.Name值的基礎上在處理.ExecuteCommand()//多個字段 db.Updateable(updateObj).ReSetValue(it=> { it.Name = it.Name+"a";it.CreateTime = DateTime.Now;}) .ExecuteCommand()
🎯注意:該功能是在
UpdateObj
參數上修改,如果是在數據庫字段+1 看1.9和2.3
1.9 重新賦值2: 列中的值+1
- SET=字段+固定變量 SqlSugarCore 5.1.4.72 +
var result67 =db.Updateable(updateObjs)//批量更新單獨處理num列 set num=num+1.PublicSetColumns(it => it.Num, it => it.Num+ 1).ExecuteCommand();//該功能默認是更新整個LIST,如果只更新一個字段需要加UpdateColumn指定一下 //2.3也有該功能不過是針對表達式方式更新,不是通過實體方式
🎯注意:該功能默認是更新整個LIST,如果只更新一個字段需要加
UpdateColumn
指定一下。
- SET=字段+集合變量 SqlSugarCore 5.1.4.77 preview02 +
db.Updateable(list).PublicSetColumns(it => it.Price, "+") //set price=price+list[i].price.ExecuteCommand();//MYSQL如果用到float表要設置精度//該功能默認是更新整個LIST,如果只更新一個字段需要加UpdateColumn指定一下
🎯注意:該功能默認是更新整個LIST,如果只更新一個字段需要加
UpdateColumn
指定一下。
二、根據表達式更新(像SQL)
🗒?表達式更新比較像SQL而不是對象。
var result=db.Updateable<Student>().SetColumns(it => new Student() { Price=it.Price+1,CreateTime=DateTime.Now}) .Where(it => it.Id >11).ExecuteCommand();
//是不是很像SQL
2.1 指定多個字段更新
🌰更新 name, createtime 條件 id=11
var result= db.Updateable<Student>()
.SetColumns(it => new Student() { Name="a",CreateTime=DateTime.Now})//類只能在表達示里面不能提取
.Where(it => it.Id == 11)
.ExecuteCommand();
//表達式寫2列更新2列,其他不會更新
2.2 一個字段更新
🌰只更新 name 條件 id=1
var result= db.Updateable<Student>()
.SetColumns(it => it.Name == "jack")//SetColumns是可以疊加的 寫2個就2個字段賦值
.Where(it => it.Id == 1)
.ExecuteCommand();// Sql
// Update Student set Name='jack' where id=1 //如果需要獲取數據庫時間我們可以用 SqlFunc.GetDate()
🎯注意:如果需要獲取數據庫時間我們可以用 SqlFunc.GetDate()
2.3 字段+1更新
//實現在原有字段+1
var result= db.Updateable<Student>()
.SetColumns(it => it.Num == it.Num+1)
.Where(it => it.Id == 1)
.ExecuteCommand();
// update Studentset iNum=iNum+1 where id=1
2.4 Set語法是支持多個的
var result71 = db.Updateable<Order>()//生成 [name]=name.SetColumns(it => it.Name == it.Name)//加一個必須更新條件防止SETIF沒有列//第一條件為true 生成 createtime=變量 .SetColumnsIF(p!=null ,it => it.CreateTime == p.Value)//第一條件為true 生成 X=變量 .SetColumnsIF(X!=null ,it => it.X== X).Where(it => it.Id == 11).ExecuteCommand();
2.5 批量更新IN
var ids=new int[]{1,2,3};
var result71 = db.Updateable<Order>().SetColumns(it => it.Name == "a").Where(it => ids.Contains(it.Id)).ExecuteCommand();// in (1,2,3)
2.6 表達式無實體更新
db.Updateable<object>().AS("Order").SetColumns("name", 1).Where("id=1").ExecuteCommand();//SQL://UPDATE [Order] SET// [Name]=@Const0 WHERE id=1//新功能 5.1.4.143+
db.Updateable<object>()//需要升到5.1.4.143.AS("UserInfo001").SetColumns(it=>SqlFunc.MappingColumn<string>("price"),it=>SqlFunc.MappingColumn<string>("price+1")).Where("price=1").ExecuteCommand();//UPDATE [UserInfo001] SET// [price]=price+1 WHERE price=1
2.7 表達式分頁更新
var q=db.Queryable<Order>().Take(10).Skip(10).OrderByDescending(it => it.CreateTime) .Select(it => it.Id);//只能是Select單個字段db.Updateable<Order>().SetColumns(it => new Order(){CreateTime = DateTime.Now}).In(it => it.Id,q).ExecuteCommand();
三、根據字典更新
//設置字典
var dt = new Dictionary<string, object>();dt.Add("id", 1);dt.Add("name", null);dt.Add("createTime", DateTime.Now);
var t66 = db.Updateable(dt).AS("student").WhereColumns("id").ExecuteCommand();//字典集合
var dtList = new List<Dictionary<string, object>>();
dtList.Add(dt);
dtList.Add(dt2);
var t666 = db.Updateable(dtList).AS("student").WhereColumns("id").ExecuteCommand();
四、根據DataTable更新
將 datatable
轉成字典集合插入
List<Dictionary<string,object>> dc= db.Utilities.DataTableToDictionaryList(dataTable);//轉成字典
var t666 = db.Updateable(dc).AS("student").WhereColumns("id").ExecuteCommand();
五、匿名、Object、接口更新
匿名對象:https://www.donet5.com/Home/Doc?typeId=2423
Object、接口和抽象類:
//這個object必須真實類對象,比如反射的Object 或者接口接收的類對象
db.UpdateableByObject(object).ExecuteCommand();//更多功能 :動態建類等
https://www.donet5.com/Home/Doc?typeId=2562
六、更多功能
6.1 更新主鍵
🎯注意:ORM
默認不支持修改主鍵,這種需求有2種方案:
-
刪除當前記錄,然后在添加一條新記錄(因為主鍵都可以更新,說明沒有外部引用,可以直接刪掉在加)
-
新建一個沒有主鍵的實體,指定表名用
Wherecolumns
更新
6.2 聯表更新
//多庫兼容
var t17 = db.Updateable<Student>().SetColumns(it =>new Student(){ SchoolId=SqlFunc.Subqueryable<School>().Where(s=>s.Id ==it.SchoolId).Select(s=>s.Id), Name = "newname" }).ExecuteCommand();//也可以在Where加條件//.Where(it => SqlFunc.Subqueryable<School>().Where(s => s.Id == it.SchoolId).Any())//優雅寫法:MySql PgSql SqlServer Oracle 達夢、金倉
//其中Oracle和達夢只支持2表 var t= db.Updateable<Order>().InnerJoin<Custom>((x, y) => x.CustomId == y.Id).SetColumns((x, y) => new Order() { Name = y.Name, Price = y.Id }).Where((x, y) => x.Id == 1).ExecuteCommand();
🤖生成 sql
:
UPDATE [STudent] SET
[SchoolId] = (SELECT TOP 1 [Id] FROM [School] WHERE ( [Id] =[STudent].[SchoolId] )) ,
[Name] = @Const0
WHERE ( [ID] = @Id1 )
6.3 調用實體內方法
db.Insertable(new UnitInsertMethod() { ...... }).CallEntityMethod(it=>it.Create()).ExecuteCommand();db.Updateable(new UnitInsertMethod() { ..... }).CallEntityMethod(it => it.modify("admint")).ExecuteCommand();//實體
public class UnitInsertMethod
{[SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]public int Id { get; set; }public string Name { get; set; }public DateTime Time { get; set; }[SqlSugar.SugarColumn(IsNullable =true)]public string UserId { get; set; }public void Create(){this.Time = DateTime.Now;this.UserId = "1";}public void modify(string a){this.Time = DateTime.Now;this.UserId = a;}
}
6.4 高性能更新
適合超大數據更新
db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//更新 吊打所有框架N倍,30列100萬8秒更新完
6.5 導航更新
https://www.donet5.com/Home/Doc?typeId=2432
6.6 默認值(系統時間)
方式1 (5.1.3.42-preview01):通過特性指定默認值
//更新取數據庫當前時間 支持多庫//UpdateServerTime =true 更新的時候取服務器時間//IsOnlyIgnoreInsert =true 插入的時候不插入該列(可用可不用根據需求來)[SugarColumn(UpdateServerTime =true,IsOnlyIgnoreInsert =true)]// getdate() now() sysdatepublic DateTime UpdateTime { get; set; }//更新根據SQL進行插入 [SugarColumn(UpdateSql = "getdate()")] //生成 getdate()public DateTime UpdateTime2 { get; set; }[SugarColumn(UpdateSql = "''")] // 生成 ''public string Str { get; set; }[SugarColumn(UpdateSql = "0")]// 生成 0public string Str { get; set; }[SugarColumn(UpdateSql = "num+1")]// 生成 num+1public string num { get; set; }
🎯注意:
- 表達更新:SetColumns(it=>new class{ name=it.name},true) 如果用到
SetColumn
需要加個true。 - 實體更新:無需任何操作。
- 方式2:通過
AOP
實現,文檔搜索:AOP , 看標題2。 - 注意:方式1和方式2不要沖突了。
🎀🎀🎀 .NET開源 ORM 框架 SqlSugar 系列 🎀🎀🎀
【開篇】.NET開源 ORM 框架 SqlSugar 系列
【入門必看】.NET開源 ORM 框架 SqlSugar 系列
【實體配置】.NET開源 ORM 框架 SqlSugar 系列
【Db First】.NET開源 ORM 框架 SqlSugar 系列
【Code First】.NET開源 ORM 框架 SqlSugar 系列
【數據事務】.NET開源 ORM 框架 SqlSugar 系列
【連接池】.NET開源 ORM 框架 SqlSugar 系列
【查詢目錄】.NET開源 ORM 框架 SqlSugar 系列
【查詢基礎】.NET開源 ORM 框架 SqlSugar 系列
【排序用法】.NET開源 ORM 框架 SqlSugar 系列
【分組去重】.NET開源 ORM 框架 SqlSugar 系列
【聯表查詢】.NET開源 ORM 框架 SqlSugar 系列
【導航查詢】.NET開源 ORM 框架 SqlSugar 系列
【子查詢】.NET開源 ORM 框架 SqlSugar 系列
【嵌套查詢】.NET開源 ORM 框架 SqlSugar 系列
【配置查詢】.NET開源 ORM 框架 SqlSugar 系列
【并集查詢】.NET開源 ORM 框架 SqlSugar 系列
【樹型查詢】.NET開源 ORM 框架 SqlSugar 系列
【表格查詢】.NET開源 ORM 框架 SqlSugar 系列
【動態表達式】.NET開源 ORM 框架 SqlSugar 系列
【查詢函數】.NET開源ORM框架 SqlSugar 系列
【過濾器】.NET開源 ORM 框架 SqlSugar 系列
【跨庫查詢、多庫查詢】.NET開源 ORM 框架
?【報表查詢】.NET開源ORM框架 SqlSugar 系列
【Where語法全解密】.NET開源ORM框架 SqlSugar 系列
【Select 語法全解密】.NET開源ORM框架 SqlSugar 系列
【查詢返回結果類型】.NET開源ORM框架 SqlSugar 系列
【insert 插入數據語法合集】.NET開源ORM框架 SqlSugar 系列
【SqlSugar雪花ID常見問題】.NET開源ORM框架 SqlSugar 系列
【update 更新數據語法合集】.NET開源ORM框架 SqlSugar 系列