mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-02-04 23:40:53 +08:00
update
96
修改.md
96
修改.md
@@ -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 执行:
|
||||||
|
|
||||||
|
|||||||
8
更新日志.md
8
更新日志.md
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user