update

28810
2019-10-30 20:17:47 +08:00
parent 378e154992
commit f8c75c8701
3 changed files with 41 additions and 0 deletions

@@ -143,6 +143,24 @@ var t10 = update.SetRaw("Title = @title", new { title = "新标题" }).Where("Id
> 适用 SetSource 更新,每次更新 version 的值都会增加 1
## ISelect.ToUpdate 高级更新
默认 IUpdate 不支持导航对象多表关联等。ISelect.ToUpdate 可将查询转为删除对象,以便支持导航对象或其他查询功能删除数据,如下:
```csharp
fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToUpdate().Set(a => a.Title, "111").ExecuteAffrows();
```
注意:此方法不是将数据查询到内存循环删除,上面的代码产生如下 SQL 执行:
```sql
UPDATE `T1` SET Title = '111' WHERE id in (select a.id from T1 a left join Options b on b.t1id = a.id where b.xxx = 1)
```
复杂更新使用该方案的好处:
- 更新前可预览测试数据,防止错误更新操作;
- 支持更加复杂的更新操作IUpdate 默认只支持简单的操作),甚至在 ISelect 上使用 Limit(10) 将只更新附合条件的前 10条记录
## 参考资料
- [《数据库事务》](https://github.com/2881099/FreeSql/wiki/%e4%ba%8b%e5%8a%a1)

@@ -73,6 +73,24 @@ var t8 = fsql.Delete<Topic>().Where(items).ToSql();
//DELETE FROM `tb_topic` WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
```
## ISelect.ToDelete 高级删除
默认 IDelete 不支持导航对象多表关联等。ISelect.ToDelete 可将查询转为删除对象,以便支持导航对象或其他查询功能删除数据,如下:
```csharp
fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToDelete().ExecuteAffrows();
```
注意:此方法不是将数据查询到内存循环删除,上面的代码产生如下 SQL 执行:
```sql
DELETE FROM `T1` WHERE id in (select a.id from T1 a left join Options b on b.t1id = a.id where b.xxx = 1)
```
复杂删除使用该方案的好处:
- 删除前可预览测试数据,防止错误删除操作;
- 支持更加复杂的删除操作IDelete 默认只支持简单的操作),甚至在 ISelect 上使用 Limit(10) 将只删除附合条件的前 10条记录
## 参考资料
- [《数据库事务》](https://github.com/2881099/FreeSql/wiki/%e4%ba%8b%e5%8a%a1)

@@ -1,6 +1,11 @@
完整版本:年数-月-日-当日版本号FreeSql、FreeSql.Repository、FreeSql.DbContext 版本号相同。
## v0.11.4
- 增加 ISelect ToDelete/ToUpdate 方法,实现更复杂的删除/更新操作;
- 移除 IUpdate/IDelete WhereExists 方法;
## v0.11.3
- 增加 FreeSql.DbContext DbSet Remove 可根据 lambda 条件删除数据的方法;