前言
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去更新某些字段