1、根据实体对象更新

所谓按实体对象更新就是:db.Updateable(参数对象) 有参数的重载

db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所有菜单

优点

1、代码少

2、支持各种批量修改

缺点

1、不支持表达式和sql函数

2、依赖 实体对象 ,没实体对象就需要手动构造

1.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 

1.2 不更新某列

不更新 TestId和CreateTime

var result=db.Updateable(updateObj).IgnoreColumns(it => new { it.CreateTime,it.TestId }).ExecuteCommand()

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中的值修改

请升级新版本 ,老版本存在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.9 重新赋值2: 列中的值+1

(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();
     
   //,该功能默认是更新整个LIST,如果只更新一个字段需要加UpdateColumn指定一下

2、 根据表达式更新(像SQL)

这种无参数重载我们称为表达式更新,他不依赖实体或者集合参数  db.Updateable<Student>()

db.Updateable<Student>().SetColumns(...).Where(...).ExecuteCommand()//正确没参数我们称为表达式更新 
db.Updateable(实体或者集合).SetColumns(...).Where(...).ExecuteCommand()//错误 如果带有参数 实体或者集合 看标题1
//注意:一定要看右边菜单 1和2的用法不要用混了

优点

1、需要更新什么写什么

2、支持SqlFunc函数也支持字段相加比如 Num=it.Num+1

缺点

1、不支持批量更新不同记录,只支持批量更新统一的结果

2、没有实体更新节约代码

根据表达式更新和上面的实体更新有着本质的区别,实体更新是要处理实体里面哪些字段要更新哪些不要更新

表达式则是需要更新什么写什么,哪种方式都可以就看你喜欢哪一种

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

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

3、根据字典更新

//字典
var dt = new Dictionary<stringobject>();
            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<stringobject>>();
dtList.Add(dt);
dtList.Add(dt2);
var t666 = db.Updateable(dtList).AS("student").WhereColumns("id").ExecuteCommand();
 
 
//

4、根据DataTable更新

将datatable转成字典集合插入

List<Dictionary<string,object>> dc= db.Utilities.DataTableToDictionaryList(dataTable);//转成字典
var t666 = db.Updateable(dc).AS("student").WhereColumns("id").ExecuteCommand();

5、匿名、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、更多功能

6.1 更新主键

ORM默认不支持修改主键,这种需求有2种方案

1、删除当前记录,然后在添加一条新记录(因为主键都可以更新,说明没有外部引用,可以直接删掉在加)

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 { getset; }
    public string Name { getset; }
    public DateTime Time { getset; }
    [SqlSugar.SugarColumn(IsNullable =true)]
    public string UserId { getset; }
  
    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.5 默认值

方式1 (5.1.3.42-preview01):通过特性指定默认值

  //更新取数据库当前时间 支持多库
  //UpdateServerTime =true 更新的时候取服务器时间
  //IsOnlyIgnoreInsert =true 插入的时候不插入该列(可用可不用根据需求来)
  [SugarColumn(UpdateServerTime =true,IsOnlyIgnoreInsert =true)]// getdate() now() sysdate
  public DateTime UpdateTime { getset; }
   
   
  //更新根据SQL进行插入 
   [SugarColumn(UpdateSql  = "getdate()")] //生成   getdate()
   public DateTime UpdateTime2 { getset; }
  
   [SugarColumn(UpdateSql  = "''")] // 生成  ''
   public string  Str { getset; }
    
   [SugarColumn(UpdateSql  = "0")]// 生成  0
   public string  Str { getset; }
    
   [SugarColumn(UpdateSql  = "num+1")]// 生成  num+1
     public string  num { getset; }

注意:

表达更新:SetColumns(it=>new class{ name=it.name},true) 如果用到SetColumn需要加个true

实体更新:无需任何操作

方式2:通过AOP实现,文档搜索:AOP  , 看标题2

注意:方式1和方式2不要冲突了

SqlSugar更新数据的更多相关文章

  1. CRL快速开发框架系列教程三(更新数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. C#使用ListView更新数据出现闪烁解决办法

    C#使用ListView更新数据出现闪烁解决办法 在使用vs自动控件ListView控件时候,更新里面的部分代码时候出现闪烁的情况 如图: 解决以后: 解决办法使用双缓冲:添加新类继承ListView ...

  3. flask+sqlite3+echarts3+ajax 异步更新数据

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  4. 使用AjaxPro实现无刷新更新数据

    需求 在一个页面动态无刷新的更新后台得到的数据.要想无刷新的更新数据,需要使用Javascript能够获取后台返回的数据,然后通过第三方Javascript库(JQuery等)动态更新web页面DOM ...

  5. Android 数据库管理— — —更新数据

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  6. MySql使用游标Cursor循环(While)更新数据

    #要修改的变量 DECLARE var_ID VARCHAR(50) DEFAULT ''; #需要修改的数据的数量 DECLARE var_UpdateCount INT; #当前循环次数 DECL ...

  7. hibernate persist update 方法没有正常工作(不保存数据,不更新数据)

    工程结构 问题描述 在工程中通过spring aop的方式配置事务,使用hibernate做持久化.在代码实现中使用hibernate persit()方法插入数据到数据库,使用hibernate u ...

  8. WinForm中DataGridView显示更新数据--人性版

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. Oracle 常用操作【01】修改、更新数据

    1. oracle 修改表名.列名.字段类型.添加表列.删除表列  alert table scott.test rename to test1--修改表名 alter table scott.tes ...

  10. mysql 插入/更新数据

    mysql 插入/更新数据 INSERT 语句 1.一次性列出全部字段的值,例如: INSERT INTO student VALUES('Chenqi','M', 29); INSERT INTO ...

随机推荐

  1. SQL Server 还原 备份集中的数据库备份与现有的 'XXX' 数据库不同

    1. 介质集有 2 个介质簇,但只提供了 1 个.必须提供所有成员. 因为在备份时有两个路径,所以备份文件会放在两个文件里面,所以在还原的时候只要把两个都添加了就可以还原了. 2. 备份集中的数据库备 ...

  2. 又拍云邵海杨 - 25年Linux老兵,聊聊运维的“术”与“道”

    您好邵总,请您先做个自我介绍吧,聊聊您的履历和现状,让大家更好的认识您,了解您的背景也有助于读者理解后面的采访内容 我是来自又拍云的邵海杨,从1998年开始使用Linux至今快25年了,资深(老鸟)L ...

  3. ICASSP 2022 | 前沿音视频成果分享:基于可变形卷积的压缩视频质量增强网络

    阿里云视频云视频编码与增强技术团队最新研究成果论文<基于可变形卷积的压缩视频质量增强网络>(Deformable Convolution Dense Network for Compres ...

  4. protobuf安装、编译和使用

    protobuf使用简单示例 一.安装 首先下载protobuf的安装包,我这里使用的是protobuf-cpp-3.21.5.tar.gz 解压安装包 tar -xzf protobuf-cpp-3 ...

  5. C# async await 异步执行方法封装 替代 BackgroundWorker

    BackWork代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...

  6. 【每日一题】6.Rinne Loves Edges (树形DP)

    题目链接:Here 树形DP 算法讲解:Here 无向联通图其实就是树的形状,其次让我们以 s 为根使得所有的叶子节点不能到达根并且让删去边权的总和最小,那么就是典型的 树形DP 了. \(dp_i\ ...

  7. AtCoder Beginner Contest 198 个人题解(AB水题,C思维,D思维+全排列,E题DFS搜索,F懵逼)

    补题链接:Here A - Div 题意:N 个不一样的糖,请问有多少种分法给 A,B两人 水题,写几组情况就能知道输出 \(N - 1\) 即可 B - Palindrome with leadin ...

  8. 我的2023年度关键词:ChatGPT、生产力工具

    2023 是 AI 大爆发的一年,这一年我在我的生产力工具中(一个叫 lowcode 的 vscode 插件)接入了 ChatGPT API,插件也进行了重构,日常搬砖也因为 ChatGPT 的引入发 ...

  9. Linux查看文件内容与处理文件

    Linux查看文件内容与处理文件 目录 Linux查看文件内容与处理文件 查看文件内容 1.查看文件类型 2.查看整个文件 3.查看部分文件 处理文件 1.创建空文件 2.过滤文件内容 3.统计文件内 ...

  10. 02-VS调试以及Qt基本使用

    VS调试以及Qt基本使用 1.汇编语言 1.1 VS中C语言嵌套汇编代码(了解) #include <stdio.h> int main() { //定义整型变量a, b, c int a ...