diff --git a/修改.md b/修改.md index 92995be..8eb718b 100644 --- a/修改.md +++ b/修改.md @@ -33,7 +33,9 @@ dywhere 支持 ## 1、更新指定列 ```csharp -var t1 = fsql.Update(1).Set(a => a.CreateTime, DateTime.Now).ExecuteAffrows(); +fsql.Update(1) + .Set(a => a.CreateTime, DateTime.Now) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `CreateTime` = '2018-12-08 00:04:59' //WHERE (`Id` = 1) ``` @@ -41,14 +43,18 @@ var t1 = fsql.Update(1).Set(a => a.CreateTime, DateTime.Now).ExecuteAffro > 支持 Set() 多次,相当于拼接 ```csharp -var t2 = fsql.Update(1).Set(a => a.Clicks + 1).ExecuteAffrows(); +fsql.Update(1) + .Set(a => a.Clicks + 1) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Clicks` = ifnull(`Clicks`,0) + 1 //WHERE (`Id` = 1) -var t2 = fsql.Update(1).Set(a => new Topic { +fsql.Update(1).Set(a => new Topic + { Clicks = a.Clicks + 1, Time = DateTime.Now -}).ExecuteAffrows(); + }) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Clicks` = `Clicks` + 1, Time = now() //WHERE (`Id` = 1) ``` @@ -56,37 +62,60 @@ var t2 = fsql.Update(1).Set(a => new Topic { ## 2、更新实体 ```csharp var item = new Topic { Id = 1, Title = "newtitle" }; -var t3 = fsql.Update().SetSource(item).ExecuteAffrows(); +fsql.Update() + .SetSource(item) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Clicks` = ?p_0, `Title` = ?p_1, `CreateTime` = ?p_2 //WHERE (`Id` = 1) -var t4 = fsql.Update().SetSource(item).UpdateColumns(a => new { a.Title, a.CreateTime }).ExecuteAffrows(); +fsql.Update() + .SetSource(item) + .UpdateColumns(a => new { a.Title, a.CreateTime }) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Title` = ?p_0, `CreateTime` = ?p_1 //WHERE (`Id` = 1) -var t5 = fsql.Update().SetSource(item).UpdateColumns(a => a.Title).ExecuteAffrows(); +fsql.Update() + .SetSource(item) + .UpdateColumns(a => a.Title) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Title` = ?p_0 //WHERE (`Id` = 1) -var t4 = fsql.Update().SetSource(item).IgnoreColumns(a => a.Clicks).ExecuteAffrows(); +fsql.Update() + .SetSource(item) + .IgnoreColumns(a => a.Clicks) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Title` = ?p_0, `CreateTime` = ?p_1 //WHERE (`Id` = 1) -var t5 = fsql.Update().SetSource(item).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ExecuteAffrows(); +fsql.Update() + .SetSource(item) + .IgnoreColumns(a => new { a.Clicks, a.CreateTime }) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Title` = ?p_0 //WHERE (`Id` = 1) var items = new List(); for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 }); -var t6 = fsql.Update().SetSource(items).ExecuteAffrows(); + +fsql.Update() + .SetSource(items) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Clicks` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END, //`Title` = CASE `Id` WHEN 1 THEN ?p_10 WHEN 2 THEN ?p_11 WHEN 3 THEN ?p_12 WHEN 4 THEN ?p_13 WHEN 5 THEN ?p_14 WHEN 6 THEN ?p_15 WHEN 7 THEN ?p_16 WHEN 8 THEN ?p_17 WHEN 9 THEN ?p_18 WHEN 10 THEN ?p_19 END, //`CreateTime` = CASE `Id` WHEN 1 THEN ?p_20 WHEN 2 THEN ?p_21 WHEN 3 THEN ?p_22 WHEN 4 THEN ?p_23 WHEN 5 THEN ?p_24 WHEN 6 THEN ?p_25 WHEN 7 THEN ?p_26 WHEN 8 THEN ?p_27 WHEN 9 THEN ?p_28 WHEN 10 THEN ?p_29 END //WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10)) -var t7 = fsql.Update().SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ExecuteAffrows(); +fsql.Update() + .SetSource(items) + .IgnoreColumns(a => new { a.Clicks, a.CreateTime }) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `Title` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END //WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10)) -var t8 = fsql.Update().SetSource(items).Set(a => a.CreateTime, DateTime.Now).ExecuteAffrows(); +fsql.Update() + .SetSource(items) + .Set(a => a.CreateTime, DateTime.Now) + .ExecuteAffrows(); //UPDATE `tb_topic` SET `CreateTime` = ?p_0 //WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10)) ``` @@ -98,18 +127,39 @@ var t8 = fsql.Update().SetSource(items).Set(a => a.CreateTime, DateTime.N > 除了上面介绍的 dywhere 构造参数外,还支持 Where lambda/sql 方法 ```csharp -var t9 = fsql.Update().Set(a => a.Title, "新标题").Where(a => a.Id == 1).ExecuteAffrows(); +fsql.Update() + .Set(a => a.Title, "新标题") + .Where(a => a.Id == 1) + .ExecuteAffrows(); //UPDATE `tb_topic` SET Title = @title WHERE (Id = 1) ``` ## 4、自定义SQL ```csharp -var t10 = fsql.Update().SetRaw("Title = @title", new { title = "新标题" }).Where("Id = @id", 1).ExecuteAffrows(); +fsql.Update() + .SetRaw("Title = @title", new { title = "新标题" }) + .Where("Id = @id", 1) + .ExecuteAffrows(); //UPDATE `tb_topic` SET Title = @title WHERE (Id = @id) ``` -## 5、列优先级 +## 5、根据 Dto 更新 + +```csharp +fsql.Update() + .SetDto(new { title = "xxx", clicks = 2 }) + .Where(a => a.Id == 1) + .ExecuteAffrows(); +//UPDATE `tb_topic` SET `Title` = ?p_0, `Clicks` = ?p_1 WHERE (Id = 1) + +fsql.Update() + .SetDto(new Dictionary { ["title"] = "xxx", ["clicks"] = 2 }) + .Where(a => a.Id == 1) + .ExecuteAffrows(); +``` + +## 6、列优先级 ```csharp > 全部列 < 指定列(Set/SetRaw) < 忽略列(IgnoreColumns) @@ -121,7 +171,7 @@ var t10 = fsql.Update().SetRaw("Title = @title", new { title = "新标题 在使用 IgnoreColumns 的情况下,只有未被指定的列会保存; -## 6、乐观锁 +## 7、乐观锁 更新整个实体数据时,在并发情况下极容易造成旧数据将新的记录更新。 @@ -131,10 +181,13 @@ var t10 = fsql.Update().SetRaw("Title = @title", new { title = "新标题 > 适用 SetSource 更新,每次更新 version 的值都会增加 1 -## 7、悲观锁 +## 8、悲观锁 ```csharp -var user = fsql.Select().ForUpdate(true).Where(a => a.Id == 1).ToOne(); +var user = fsql.Select() + .ForUpdate(true) + .Where(a => a.Id == 1) + .ToOne(); //SELECT ... FROM User a for update nowait ``` @@ -144,12 +197,15 @@ for update 在 Oracle/PostgreSQL/MySql 是通用的写法,我们对 SqlServer SELECT ... FROM [User] a With(UpdLock, RowLock, NoWait) ``` -## 8、ISelect.ToUpdate 高级更新 +## 9、ISelect.ToUpdate 高级更新 默认 IUpdate 不支持导航对象,多表关联等。ISelect.ToUpdate 可将查询转为更新对象,以便支持导航对象或其他查询功能更新数据,如下: ```csharp -fsql.Select().Where(a => a.Options.xxx == 1).ToUpdate().Set(a => a.Title, "111").ExecuteAffrows(); +fsql.Select().Where(a => a.Options.xxx == 1) + .ToUpdate() + .Set(a => a.Title, "111") + .ExecuteAffrows(); ``` 注意:此方法不是将数据查询到内存再更新,上面的代码产生如下 SQL 执行: diff --git a/更新日志.md b/更新日志.md index e82a42c..d91aeea 100644 --- a/更新日志.md +++ b/更新日志.md @@ -3,11 +3,13 @@ ## v1.2.0-preview -- 修复 ToList(a => new Dto {}) 这种情况按字段名匹配r问题,应该按属性名;#208 -- 增加 nuget 包强签名发布;#201 +- 修复 ToList(a => new Dto {}) 这种情况按字段名匹配r问题,应该按属性名;[#208](https://github.com/2881099/FreeSql/issues/208) +- 增加 nuget 包强签名发布;[#201](https://github.com/2881099/FreeSql/issues/201) - 完善 IUpdate.SetSource 组合主键的数据更新单元测试; - 修复 Oracle 导航属性 表别名过长的问题; -- 修复 DbSet.Where 表达式解析报错的问题;#216 +- 修复 DbSet.Where 表达式解析报错的问题;[#216](https://github.com/2881099/FreeSql/issues/216) +- 修复 DbContext/Repository Update 不更新 DbUpdateValue 的问题;[#219](https://github.com/2881099/FreeSql/issues/219) +- 增加 IUpdate.SetDto 根据 dto 更新的方法;[#218](https://github.com/2881099/FreeSql/issues/218) ## v1.1.0