update

28810
2020-02-28 12:02:00 +08:00
parent 36b28eb773
commit 4a273ed841
2 changed files with 81 additions and 23 deletions

@@ -33,7 +33,9 @@ dywhere 支持
## 1、更新指定列 ## 1、更新指定列
```csharp ```csharp
var t1 = fsql.Update<Topic>(1).Set(a => a.CreateTime, DateTime.Now).ExecuteAffrows(); fsql.Update<Topic>(1)
.Set(a => a.CreateTime, DateTime.Now)
.ExecuteAffrows();
//UPDATE `tb_topic` SET `CreateTime` = '2018-12-08 00:04:59' //UPDATE `tb_topic` SET `CreateTime` = '2018-12-08 00:04:59'
//WHERE (`Id` = 1) //WHERE (`Id` = 1)
``` ```
@@ -41,14 +43,18 @@ var t1 = fsql.Update<Topic>(1).Set(a => a.CreateTime, DateTime.Now).ExecuteAffro
> 支持 Set() 多次,相当于拼接 > 支持 Set() 多次,相当于拼接
```csharp ```csharp
var t2 = fsql.Update<Topic>(1).Set(a => a.Clicks + 1).ExecuteAffrows(); fsql.Update<Topic>(1)
.Set(a => a.Clicks + 1)
.ExecuteAffrows();
//UPDATE `tb_topic` SET `Clicks` = ifnull(`Clicks`,0) + 1 //UPDATE `tb_topic` SET `Clicks` = ifnull(`Clicks`,0) + 1
//WHERE (`Id` = 1) //WHERE (`Id` = 1)
var t2 = fsql.Update<Topic>(1).Set(a => new Topic { fsql.Update<Topic>(1).Set(a => new Topic
{
Clicks = a.Clicks + 1, Clicks = a.Clicks + 1,
Time = DateTime.Now Time = DateTime.Now
}).ExecuteAffrows(); })
.ExecuteAffrows();
//UPDATE `tb_topic` SET `Clicks` = `Clicks` + 1, Time = now() //UPDATE `tb_topic` SET `Clicks` = `Clicks` + 1, Time = now()
//WHERE (`Id` = 1) //WHERE (`Id` = 1)
``` ```
@@ -56,37 +62,60 @@ var t2 = fsql.Update<Topic>(1).Set(a => new Topic {
## 2、更新实体 ## 2、更新实体
```csharp ```csharp
var item = new Topic { Id = 1, Title = "newtitle" }; var item = new Topic { Id = 1, Title = "newtitle" };
var t3 = fsql.Update<Topic>().SetSource(item).ExecuteAffrows(); fsql.Update<Topic>()
.SetSource(item)
.ExecuteAffrows();
//UPDATE `tb_topic` SET `Clicks` = ?p_0, `Title` = ?p_1, `CreateTime` = ?p_2 //UPDATE `tb_topic` SET `Clicks` = ?p_0, `Title` = ?p_1, `CreateTime` = ?p_2
//WHERE (`Id` = 1) //WHERE (`Id` = 1)
var t4 = fsql.Update<Topic>().SetSource(item).UpdateColumns(a => new { a.Title, a.CreateTime }).ExecuteAffrows(); fsql.Update<Topic>()
.SetSource(item)
.UpdateColumns(a => new { a.Title, a.CreateTime })
.ExecuteAffrows();
//UPDATE `tb_topic` SET `Title` = ?p_0, `CreateTime` = ?p_1 //UPDATE `tb_topic` SET `Title` = ?p_0, `CreateTime` = ?p_1
//WHERE (`Id` = 1) //WHERE (`Id` = 1)
var t5 = fsql.Update<Topic>().SetSource(item).UpdateColumns(a => a.Title).ExecuteAffrows(); fsql.Update<Topic>()
.SetSource(item)
.UpdateColumns(a => a.Title)
.ExecuteAffrows();
//UPDATE `tb_topic` SET `Title` = ?p_0 //UPDATE `tb_topic` SET `Title` = ?p_0
//WHERE (`Id` = 1) //WHERE (`Id` = 1)
var t4 = fsql.Update<Topic>().SetSource(item).IgnoreColumns(a => a.Clicks).ExecuteAffrows(); fsql.Update<Topic>()
.SetSource(item)
.IgnoreColumns(a => a.Clicks)
.ExecuteAffrows();
//UPDATE `tb_topic` SET `Title` = ?p_0, `CreateTime` = ?p_1 //UPDATE `tb_topic` SET `Title` = ?p_0, `CreateTime` = ?p_1
//WHERE (`Id` = 1) //WHERE (`Id` = 1)
var t5 = fsql.Update<Topic>().SetSource(item).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ExecuteAffrows(); fsql.Update<Topic>()
.SetSource(item)
.IgnoreColumns(a => new { a.Clicks, a.CreateTime })
.ExecuteAffrows();
//UPDATE `tb_topic` SET `Title` = ?p_0 //UPDATE `tb_topic` SET `Title` = ?p_0
//WHERE (`Id` = 1) //WHERE (`Id` = 1)
var items = new List<Topic>(); var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 }); for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
var t6 = fsql.Update<Topic>().SetSource(items).ExecuteAffrows();
fsql.Update<Topic>()
.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, //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, //`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 //`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)) //WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
var t7 = fsql.Update<Topic>().SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ExecuteAffrows(); fsql.Update<Topic>()
.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 //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)) //WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
var t8 = fsql.Update<Topic>().SetSource(items).Set(a => a.CreateTime, DateTime.Now).ExecuteAffrows(); fsql.Update<Topic>()
.SetSource(items)
.Set(a => a.CreateTime, DateTime.Now)
.ExecuteAffrows();
//UPDATE `tb_topic` SET `CreateTime` = ?p_0 //UPDATE `tb_topic` SET `CreateTime` = ?p_0
//WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10)) //WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
``` ```
@@ -98,18 +127,39 @@ var t8 = fsql.Update<Topic>().SetSource(items).Set(a => a.CreateTime, DateTime.N
> 除了上面介绍的 dywhere 构造参数外,还支持 Where lambda/sql 方法 > 除了上面介绍的 dywhere 构造参数外,还支持 Where lambda/sql 方法
```csharp ```csharp
var t9 = fsql.Update<Topic>().Set(a => a.Title, "新标题").Where(a => a.Id == 1).ExecuteAffrows(); fsql.Update<Topic>()
.Set(a => a.Title, "新标题")
.Where(a => a.Id == 1)
.ExecuteAffrows();
//UPDATE `tb_topic` SET Title = @title WHERE (Id = 1) //UPDATE `tb_topic` SET Title = @title WHERE (Id = 1)
``` ```
## 4、自定义SQL ## 4、自定义SQL
```csharp ```csharp
var t10 = fsql.Update<Topic>().SetRaw("Title = @title", new { title = "新标题" }).Where("Id = @id", 1).ExecuteAffrows(); fsql.Update<Topic>()
.SetRaw("Title = @title", new { title = "新标题" })
.Where("Id = @id", 1)
.ExecuteAffrows();
//UPDATE `tb_topic` SET Title = @title WHERE (Id = @id) //UPDATE `tb_topic` SET Title = @title WHERE (Id = @id)
``` ```
## 5、列优先级 ## 5、根据 Dto 更新
```csharp
fsql.Update<T>()
.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<T>()
.SetDto(new Dictionary<string, object> { ["title"] = "xxx", ["clicks"] = 2 })
.Where(a => a.Id == 1)
.ExecuteAffrows();
```
## 6、列优先级
```csharp ```csharp
> 全部列 < 指定列(Set/SetRaw) < 忽略列(IgnoreColumns) > 全部列 < 指定列(Set/SetRaw) < 忽略列(IgnoreColumns)
@@ -121,7 +171,7 @@ var t10 = fsql.Update<Topic>().SetRaw("Title = @title", new { title = "新标题
在使用 IgnoreColumns 的情况下,只有未被指定的列会保存; 在使用 IgnoreColumns 的情况下,只有未被指定的列会保存;
## 6、乐观锁 ## 7、乐观锁
更新整个实体数据时,在并发情况下极容易造成旧数据将新的记录更新。 更新整个实体数据时,在并发情况下极容易造成旧数据将新的记录更新。
@@ -131,10 +181,13 @@ var t10 = fsql.Update<Topic>().SetRaw("Title = @title", new { title = "新标题
> 适用 SetSource 更新,每次更新 version 的值都会增加 1 > 适用 SetSource 更新,每次更新 version 的值都会增加 1
## 7、悲观锁 ## 8、悲观锁
```csharp ```csharp
var user = fsql.Select<User>().ForUpdate(true).Where(a => a.Id == 1).ToOne(); var user = fsql.Select<User>()
.ForUpdate(true)
.Where(a => a.Id == 1)
.ToOne();
//SELECT ... FROM User a for update nowait //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) SELECT ... FROM [User] a With(UpdLock, RowLock, NoWait)
``` ```
## 8、ISelect.ToUpdate 高级更新 ## 9、ISelect.ToUpdate 高级更新
默认 IUpdate 不支持导航对象多表关联等。ISelect.ToUpdate 可将查询转为更新对象,以便支持导航对象或其他查询功能更新数据,如下: 默认 IUpdate 不支持导航对象多表关联等。ISelect.ToUpdate 可将查询转为更新对象,以便支持导航对象或其他查询功能更新数据,如下:
```csharp ```csharp
fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToUpdate().Set(a => a.Title, "111").ExecuteAffrows(); fsql.Select<T1>().Where(a => a.Options.xxx == 1)
.ToUpdate()
.Set(a => a.Title, "111")
.ExecuteAffrows();
``` ```
注意:此方法不是将数据查询到内存再更新,上面的代码产生如下 SQL 执行: 注意:此方法不是将数据查询到内存再更新,上面的代码产生如下 SQL 执行:

@@ -3,11 +3,13 @@
## v1.2.0-preview ## v1.2.0-preview
- 修复 ToList(a => new Dto {}) 这种情况按字段名匹配r问题应该按属性名#208 - 修复 ToList(a => new Dto {}) 这种情况按字段名匹配r问题应该按属性名[#208](https://github.com/2881099/FreeSql/issues/208)
- 增加 nuget 包强签名发布;#201 - 增加 nuget 包强签名发布;[#201](https://github.com/2881099/FreeSql/issues/201)
- 完善 IUpdate.SetSource 组合主键的数据更新单元测试; - 完善 IUpdate.SetSource 组合主键的数据更新单元测试;
- 修复 Oracle 导航属性 表别名过长的问题; - 修复 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 ## v1.1.0