• FreeSql学习笔记——6.修改


    前言
      FreeSql 提供丰富的数据库更新功能,支持单条或批量更新,支持更新指定的字段,在特定的数据库执行还可以返回更新后的记录。与删除一样,没有条件的话不会执行,避免全表修改到全表;
     
     

    指定列更新

    _freeSql.Update<Student>(1)
                    .Set(x=>x.Name,"1111")
                    .ExecuteAffrows();
    //UPDATE [Student] SET [Name] = @p_0 WHERE([Id] = 1)
      更新很像直接写sql语句啊,直接使用主键更新,主键传入在Update()作为参数,赋值在Set()中;
     

    条件更新

    _freeSql.Update<Student>()
                    .Set(x => x.Name, "zz")
                    .Where(x => x.Id > 10)
                    .ExecuteAffrows();
    //UPDATE [Student] SET [Name] = @p_0 WHERE([Id] > 10)
     

    实体更新(官方推荐)

      实体更新将值修改后传入Update()中,实现修改,修改过程中可以像新增操作一样指定列、忽略列,也可以忽略空列;如果指定了Set条件更新,SetSource实体更新会失效
    var student = new Student { Id = 1,Name="zz" };
    _freeSql.Update<Student>()
                .SetSource(student)
                .ExecuteAffrows();
    //UPDATE [Student] SET [Name] = @p_0, [Age] = @p_1, [Status] = @p_2, [AddTime] = @p_3, [Remark] = @p_4 WHERE([Id] = 1)
    
    _freeSql.Update<Student>()
                .SetSourceIgnore(student, x => x == null)//忽略空列
                .ExecuteAffrows();
    //UPDATE [Student] SET [Name] = @p_0, [Age] = @p_1, [Status] = @p_2, [AddTime] = @p_3 WHERE([Id] = 1)
     
     

    指定列、忽略列

      与新增一样,修改操作可以指定要修改的字段或不要修改的字段,从而使修改操作更灵活
    var student = new Student { Id = 1, Name = "zz", AddTime = DateTime.Now };
    _freeSql.Update<Student>()
                      .SetSource(student)
                      .UpdateColumns(a => a.Name)
                      .ExecuteAffrows();
    //UPDATE [Student] SET [Name] = @p_0 WHERE([Id] = 1)
    
    _freeSql.Update<Student>()
                      .SetSource(student)
                      .IgnoreColumns(x => new { x.Age, x.Status })
                      .ExecuteAffrows();
    //UPDATE [Student] SET [Name] = @p_0, [AddTime] = @p_1, [Remark] = @p_2 WHERE([Id] = 1)
     
     

    自定义SQL

      自定义Set中更新字段,直接指定需要更新的字段,给我的直观感受就是类似于参数化sql语句
    _freeSql.Update<Student>()
                .SetRaw("Name=@name,Age=@age", new { name = "zz", age = 10 })
                .Where("Id=@id", 1)
                .ExecuteAffrows();
    //UPDATE [Student] SET Name=@name,Age=@age 
    //WHERE (Id=@id)
     

    Dto更新

      将自定义实体传如Update(),根据实体拼接修改字段,如果实体中字段与Dto中字段不匹配,则忽略掉不匹配字段,有了dto更新就不用在new一个实体对象了
    _freeSql.Update<Student>()
                .SetDto(new { Name = "z", abc = 2 })
                .Where(x => x.Id == 1)
                .ExecuteAffrows();
    //UPDATE [Student] SET [Name] = @p_0 WHERE([Id] = 1)
     

    字典更新

     有点像自定义更新,会将字典的key和value拼接成需要更新的值,如果数据库不存在字典的key字段会忽略掉
    var dic = new Dictionary<string, object>();
    dic.Add("Id", 1);
    dic.Add("Name", "zz");
    dic.Add("Addtime", DateTime.Now);
    
    _freeSql.UpdateDict(dic).AsTable(nameof(Student)).WherePrimary("Id").ExecuteAffrows();
    //UPDATE [Student] SET [Name] = @p_0, [Addtime] = @p_1 WHERE([Id] = 1)
     
     
    一个更新操作有这么多的方式实现,是不是有点迷糊了,首先是是Set/SetRaw,然后又有SetSource,最后又来个SetDto,区分一下吧~
     
    Set/SetRaw  主要用于指定的字段更新,例如,一个大表上百字段,总不能new实体或者一个个全组装好吧。。
    SetSource    主要用于已有实体对象,然后使用对象配合指定列、忽略列进行更新
    SetDto       主要用于在已有目标值的Dto对象批量更新操作,想象下前后端互相传参的场景,下使用Dto去更新某些字段
     
     
     
     
     
  • 相关阅读:
    BFC是什么?如何形成BFC,有什么作用?
    z-index 有什么作用? 如何使用?
    有几种定位方式?分别是如何实现定位的?参考点是什么?使用场景是什么?
    Promise
    token
    文档碎片
    ECharts常用配置项
    for each()和map()的区别
    window.onload和$(docunment).ready的区别
    密码的两种常用加密方式
  • 原文地址:https://www.cnblogs.com/zousc/p/16304748.html
Copyright © 2020-2023  润新知