单表更新、更新数据

更新总共分为3种方式,本章内容比较多,可看右边的【目录导航】进行查找内容


1、根据实体对象更新

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

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

优点

1、代码少

2、支持各种批量修改

缺点

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

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

 1.1 单条与批量

根据实体更新需要给实体配置主键,参考文档实体配置

//根据主键更新单条 参数 Class
var result= db.Updateable(updateObj).ExecuteCommand();//实体有多少列更新多少列


//只更新修改字段  5.1.1-preview11 新功能
db.Tracking(updateObj);//创建跟踪
updateObj.Name = "a1" + Guid.NewGuid();//只改修改了name那么只会更新name
db.Updateable(updateObj).ExecuteCommand();//跟踪批量操作不会生效,原因:默认最佳性能(跟踪批量性能差,自已循环)
//可以清空跟踪db.TempItems = null;


//批量更新参数 List<Class>
var result= db.Updateable(updateObjs).ExecuteCommand();


//大数据批量更新  适合列多数据多的更新 (MySql连接字符串要加AllowLoadLocalInfile=true )
db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());


// 获取数据库时间 ,因没办法使用SqlFunc函数只能这么写
var dbTime = db.GetDate();

函数说明
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();

//UpdateColumnsIF 不能叠加,建议用表达式方式更新的SetColumnsIF

//文档 2.1方式也可能实现

 1.4 NULL列不更新

注意:不能支持批量 ,因为忽略null之后列数不一样,所以批量需要循环

db.Updateable(insertObj).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand();
//更新忽略null字段

 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 重新赋值  5.0.4.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 看2.3


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

 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<DbTableInfo>()
                .AS("Order")
                .SetColumns("name", 1)
                .Where("id=1").ExecuteCommand();
                
  //SQL:
  //UPDATE [Order]  SET
  //         [Name]=@Const0  WHERE id=1

3、根据字典更新

//字典
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();


//

 

4、根据DataTable更新

将datatable转成字典集合插入

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



5、使用案例

5.1 更新主键

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

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

2、新建一个没有主键的实体,指定表名用Wherecolumns更新

5.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"  })
  .Where(it => it.Id == 1).ExecuteCommand();

sql

UPDATE [STudent]  SET            
[SchoolId] = (SELECT TOP 1 [Id] FROM [School] WHERE ( [Id] =[STudent].[SchoolId] )) ,             
[Name] = @Const0   
WHERE ( [ID] = @Id1 )

5.3  调用实体内方法

 db.Insertable(new UnitInsertMethod() { Name = "1" }).CallEntityMethod(it=>it.Create()).ExecuteCommand();
 db.Updateable(new UnitInsertMethod() { Name = "1" }).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;
    }
} 

5.4 高性能更新 

适合超大数据更新

db.Fastest<RealmAuctionDatum>().BulkUpdate(GetList());//更新 吊打所有框架N倍,30列100万8秒更新完


5.5 匿名对象更新

https://www.donet5.com/Home/Doc?typeId=2423


5.6 导航更新

https://www.donet5.com/Home/Doc?typeId=2432

文档:SqlSugar5.0