diff --git a/修改.md b/修改.md index 00ede8c..c635994 100644 --- a/修改.md +++ b/修改.md @@ -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().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) diff --git a/删除.md b/删除.md index d250d06..80f48d8 100644 --- a/删除.md +++ b/删除.md @@ -73,6 +73,24 @@ var t8 = fsql.Delete().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().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) diff --git a/更新日志.md b/更新日志.md index 8cfd536..2293a0a 100644 --- a/更新日志.md +++ b/更新日志.md @@ -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 条件删除数据的方法;