所谓按实体对象更新就是:db.Updateable(参数对象) 有参数的重载
db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所有菜单
根据实体更新需要给实体配置主键,参考文档实体配置
//根据主键更新单条 参数 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
函数 | 说明 |
ExecuteCommand | 返回受影响行数 , update where 如果没找到那么就会返回 0 |
ExecuteCommandHasChange | 返回bool ,等同于 bool isChange= ExecuteCommand()>0 |
不更新 TestId和CreateTime
var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand() //也可以用特性 [SugarColumn(IsOnlyIgnoreUpdate=true)] public DateTime UpdateDate{get;set;}
只更新 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();
注意:高版本支持批量 ,用该方法批量性能差些,因为列不同所以没必然用批量语法
//更新忽略null字段 db.Updateable(data).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand(); //更新忽略null并且忽略默认值 (比如int默认值是0就不更新) db.Updateable(data). IgnoreColumns(ignoreAllNullColumns:true,ignoreAllDefaultValue:true).ExecuteCommand();
用法同上唯一区别就是用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}) //条件列不会被更新,只会作为条件
注意:单条操作都支持 ,批量只支持部分库,多库考虑批量操作不建议用这个方法
db.Updateable(updateObj).Where(it=>it.Id==1).ExecuteCommand() //如果是集合操作请更新到5.0.4版本之前版本禁止使用, 并且只有部分库支持
//大数据更新,适合大数据更新,可以处理百万级 db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//特色功能:吊打所有框架N倍,30列100万8秒更新完
请升级新版本 ,老版本存在BUG,所以没公开这个函数
//单个字段 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) 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也有该功能不过是针对表达式方式更新,不是通过实体方式
(2) 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指定一下
表达式更新比较像SQL而不是对象
var result=db.Updateable<Student>() .SetColumns(it => new Student() { Price=it.Price+1,CreateTime=DateTime.Now}) .Where(it => it.Id >11) .ExecuteCommand(); //是不是很像SQL
更新 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列,其他不会更新
只更新 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()
//实现在原有字段+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
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();
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)
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
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转成字典集合插入
List<Dictionary<string,object>> dc= db.Utilities.DataTableToDictionaryList(dataTable);//转成字典 var t666 = db.Updateable(dc).AS("student").WhereColumns("id").ExecuteCommand();
匿名对象:
https://www.donet5.com/Home/Doc?typeId=2423
Object、接口和抽象类:
//这个object必须真实类对象,比如反射的Object 或者接口接收的类对象 db.UpdateableByObject(object).ExecuteCommand(); //更多功能 :动态建类等 https://www.donet5.com/Home/Doc?typeId=2562
ORM默认不支持修改主键,这种需求有2种方案
1、删除当前记录,然后在添加一条新记录(因为主键都可以更新,说明没有外部引用,可以直接删掉在加)
2、新建一个没有主键的实体,指定表名用Wherecolumns更新
//多库兼容 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 )
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; } }
适合超大数据更新
db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//更新 吊打所有框架N倍,30列100万8秒更新完
https://www.donet5.com/Home/Doc?typeId=2432
方式1 (5.1.3.42-preview01):通过特性指定默认值
//更新取数据库当前时间 支持多库 //UpdateServerTime =true 更新的时候取服务器时间 //IsOnlyIgnoreInsert =true 插入的时候不插入该列(可用可不用根据需求来) [SugarColumn(UpdateServerTime =true,IsOnlyIgnoreInsert =true)]// getdate() now() sysdate public DateTime UpdateTime { get; set; } //更新根据SQL进行插入 [SugarColumn(UpdateSql = "getdate()")] //生成 getdate() public DateTime UpdateTime2 { get; set; } [SugarColumn(UpdateSql = "''")] // 生成 '' public string Str { get; set; } [SugarColumn(UpdateSql = "0")]// 生成 0 public string Str { get; set; } [SugarColumn(UpdateSql = "num+1")]// 生成 num+1 public string num { get; set; }
注意:
表达更新:SetColumns(it=>new class{ name=it.name},true) 如果用到SetColumn需要加个true
实体更新:无需任何操作
方式2:通过AOP实现,文档搜索:AOP , 看标题2
注意:方式1和方式2不要冲突了
2016 © donet5.comApache Licence 2.0