From 18cabd22b98b3f51fcd4d839dff4a44403d4d87c Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 4 Aug 2020 20:54:15 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=AE=8C=E5=96=84=20AsTreeCte=20+=20ToUpda?= =?UTF-8?q?te/ToDelete=20=E5=AE=9E=E7=8E=B0=E6=A0=91=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=AD=90=E8=8A=82=E7=82=B9=E5=88=A0=E9=99=A4=E6=88=96=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/DbSet/DbSetSync.cs | 8 +- FreeSql.DbContext/FreeSql.DbContext.xml | 22 +---- .../Repository/Repository/BaseRepository.cs | 6 +- .../Repository/Repository/IBaseRepository.cs | 3 +- .../MySqlConnector/Curd/MySqlSelectTest.cs | 24 ++++- .../g.cs | 1 + .../Dameng/Curd/DamengSelectTest.cs | 18 ++++ .../KingbaseES/Curd/KingbaseESSelectTest.cs | 18 ++++ .../MySql/Curd/MySqlSelectTest.cs | 24 ++++- .../Oracle/Curd/OracleSelectTest.cs | 18 ++++ .../PostgreSQL/Curd/PostgreSQLSelectTest.cs | 18 ++++ .../SqlServer/Curd/SqlServerSelectTest.cs | 18 ++++ .../FreeSql.Tests.Provider.Odbc/g.cs | 1 + .../Dameng/Curd/DamengSelectTest.cs | 18 ++++ .../MySql/Curd/MySqlSelectTest.cs | 24 ++++- .../Oracle/Curd/OracleSelectTest.cs | 18 ++++ .../PostgreSQL/Curd/PostgreSQLSelectTest.cs | 18 ++++ .../ShenTong/Curd/ShenTongSelectTest.cs | 2 + .../SqlServer/Curd/SqlServerSelectTest.cs | 18 ++++ .../Sqlite/Curd/SqliteSelectTest.cs | 16 ++++ FreeSql.Tests/FreeSql.Tests/g.cs | 1 + .../Internal/CommonProvider/DeleteProvider.cs | 24 ++--- .../SelectProvider/Select0Provider.cs | 89 +++++++++++++++---- .../Internal/CommonProvider/UpdateProvider.cs | 2 + 24 files changed, 346 insertions(+), 63 deletions(-) diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index b6a38362..a6dddb08 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -567,11 +567,13 @@ namespace FreeSql /// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句 /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存 /// + /// 可选参数:手工传递最终的 data 值进行对比默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比 /// - public int EndEdit() + public int EndEdit(List data = null) { + if (data == null) data = _dataEditing; var beforeAffrows = 0; - if (_dataEditing == null) return 0; + if (data == null) return 0; var oldEnable = _db.Options.EnableAddOrUpdateNavigateList; _db.Options.EnableAddOrUpdateNavigateList = false; try @@ -579,7 +581,7 @@ namespace FreeSql DbContextFlushCommand(); var addList = new List(); var ediList = new List>(); - foreach (var item in _dataEditing) + foreach (var item in data) { var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false); if (_statesEditing.TryRemove(key, out var state) == false) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index e76e3740..d61f6f2f 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -125,13 +125,6 @@ 清空状态数据 - - - 根据 lambda 条件删除数据 - - - - 添加 @@ -183,12 +176,13 @@ - + 完成编辑数据,进行保存动作 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句 注意:* 本方法只支持单表操作,不支持导航属性级联保存 + 可选参数:手工传递最终的 data 值进行对比默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比 @@ -330,12 +324,13 @@ - + 完成编辑数据,进行保存动作 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句 注意:* 本方法只支持单表操作,不支持导航属性级联保存 + 可选参数:手工传递最终的 data 值进行对比默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比 @@ -520,14 +515,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 027c53a2..3a166cd5 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -142,7 +142,7 @@ namespace FreeSql } public void BeginEdit(List data) => _dbset.BeginEdit(data); - public int EndEdit() + public int EndEdit(List data = null) { _db.FlushCommand(); if (UnitOfWork?.GetOrBeginTransaction(true) == null && _db.OrmOriginal.Ado.TransactionCurrentThread == null) @@ -152,7 +152,7 @@ namespace FreeSql UnitOfWork = new UnitOfWork(_db.OrmOriginal); try { - affrows = _dbset.EndEdit(); + affrows = _dbset.EndEdit(data); UnitOfWork.Commit(); } catch @@ -167,7 +167,7 @@ namespace FreeSql } return affrows; } - return _dbset.EndEdit(); + return _dbset.EndEdit(data); } } diff --git a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs index c66937ee..29832d44 100644 --- a/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/IBaseRepository.cs @@ -92,8 +92,9 @@ namespace FreeSql /// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句 /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存 /// + /// 可选参数:手工传递最终的 data 值进行对比默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比 /// - int EndEdit(); + int EndEdit(List data = null); #if net40 #else diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs index 7b587941..c9d9dc32 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs @@ -1904,7 +1904,7 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code); Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); - //t3 = fsql.Select().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList(); + //t3 = fsql.Select().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList(); //Assert.Single(t3); //Assert.Equal("100000", t3[0].Code); //Assert.Single(t3[0].Childs); @@ -1913,18 +1913,34 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 //Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code); //Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); - //t3 = fsql.Select().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList(); + //t3 = fsql.Select().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList(); //Assert.Equal(4, t3.Count); //Assert.Equal("100000", t3[0].Code); //Assert.Equal("110000", t3[1].Code); //Assert.Equal("110100", t3[2].Code); //Assert.Equal("110101", t3[3].Code); - //t3 = fsql.Select().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList(); + //t3 = fsql.Select().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList(); //Assert.Equal(3, t3.Count); //Assert.Equal("110000", t3[0].Code); //Assert.Equal("110100", t3[1].Code); //Assert.Equal("110101", t3[2].Code); + + //var select = fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte() + // //.OrderBy("a.cte_level desc") //递归层级 + // ; + //// var list = select.ToList(); //自己调试看查到的数据 + //select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + //Assert.Equal(855, fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte().Distinct().First(a => a.testint)); + + //Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + //Assert.False(fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1938,6 +1954,8 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/g.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/g.cs index bd67be80..efaeec3a 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/g.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/g.cs @@ -10,6 +10,7 @@ public class g static Lazy mysqlLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10") //.UseConnectionFactory(FreeSql.DataType.MySql, () => new MySql.Data.MySqlClient.MySqlConnection("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;")) + //.UseConnectionString(FreeSql.DataType.MySql, "Data Source=192.168.164.10;Port=33061;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10") .UseAutoSyncStructure(true) //.UseGenerateCommandParameterWithLambda(true) .UseMonitorCommand( diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs index f1705d77..a50acd5b 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs @@ -1808,6 +1808,22 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1821,6 +1837,8 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs index bba60c6e..6abeb543 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/Curd/KingbaseESSelectTest.cs @@ -1764,6 +1764,22 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE"" Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1777,6 +1793,8 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE"" [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs index 00203bd0..d4a1cc95 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs @@ -1915,7 +1915,7 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code); Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); - //t3 = fsql.Select().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList(); + //t3 = fsql.Select().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList(); //Assert.Single(t3); //Assert.Equal("100000", t3[0].Code); //Assert.Single(t3[0].Childs); @@ -1924,18 +1924,34 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 //Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code); //Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); - //t3 = fsql.Select().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList(); + //t3 = fsql.Select().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList(); //Assert.Equal(4, t3.Count); //Assert.Equal("100000", t3[0].Code); //Assert.Equal("110000", t3[1].Code); //Assert.Equal("110100", t3[2].Code); //Assert.Equal("110101", t3[3].Code); - //t3 = fsql.Select().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList(); + //t3 = fsql.Select().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList(); //Assert.Equal(3, t3.Count); //Assert.Equal("110000", t3[0].Code); //Assert.Equal("110100", t3[1].Code); //Assert.Equal("110101", t3[2].Code); + + //var select = fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte() + // //.OrderBy("a.cte_level desc") //递归层级 + // ; + //// var list = select.ToList(); //自己调试看查到的数据 + //select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + //Assert.Equal(855, fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte().Distinct().First(a => a.testint)); + + //Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + //Assert.False(fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1949,6 +1965,8 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs index a21ab06c..5e18bcfc 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs @@ -1800,6 +1800,22 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1813,6 +1829,8 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs index 5dad0dd0..bccdf194 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -1859,6 +1859,22 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title"" Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1872,6 +1888,8 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title"" [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs index 78f16fee..dcfcc65d 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs @@ -1750,6 +1750,22 @@ WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT b.[Title] Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1763,6 +1779,8 @@ WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT b.[Title] [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs index 0f812460..fbe03f84 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs @@ -9,6 +9,7 @@ public class g static Lazy mysqlLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.OdbcMySql, "Driver={MySQL ODBC 8.0 Unicode Driver};Server=127.0.0.1;Persist Security Info=False;Trusted_Connection=Yes;UID=root;PWD=root;DATABASE=cccddd_odbc;Charset=utf8;SslMode=none;Max pool size=2") //.UseConnectionFactory(FreeSql.DataType.OdbcMySql, () => new System.Data.Odbc.OdbcConnection("Driver={MySQL ODBC 8.0 Unicode Driver};Server=127.0.0.1;Persist Security Info=False;Trusted_Connection=Yes;UID=root;PWD=root;DATABASE=cccddd_odbc;Charset=utf8;SslMode=none;")) + //.UseConnectionString(FreeSql.DataType.OdbcMySql, "Driver={MySQL ODBC 8.0 Unicode Driver};Server=192.168.164.10;port=33061;Persist Security Info=False;Trusted_Connection=Yes;UID=root;PWD=root;DATABASE=cccddd_odbc;Charset=utf8;SslMode=none;Max pool size=2") .UseAutoSyncStructure(true) .UseMonitorCommand( cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前 diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs index bb33c0bb..441fc1f9 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengSelectTest.cs @@ -1809,6 +1809,22 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1822,6 +1838,8 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 29f58ac3..92eade33 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -1968,7 +1968,7 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code); Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); - //t3 = fsql.Select().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList(); + //t3 = fsql.Select().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList(); //Assert.Single(t3); //Assert.Equal("100000", t3[0].Code); //Assert.Single(t3[0].Childs); @@ -1977,18 +1977,34 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 //Assert.Equal("110100", t3[0].Childs[0].Childs[0].Code); //Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); - //t3 = fsql.Select().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList(); + //t3 = fsql.Select().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList(); //Assert.Equal(4, t3.Count); //Assert.Equal("100000", t3[0].Code); //Assert.Equal("110000", t3[1].Code); //Assert.Equal("110100", t3[2].Code); //Assert.Equal("110101", t3[3].Code); - //t3 = fsql.Select().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList(); + //t3 = fsql.Select().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList(); //Assert.Equal(3, t3.Count); //Assert.Equal("110000", t3[0].Code); //Assert.Equal("110100", t3[1].Code); //Assert.Equal("110101", t3[2].Code); + + //var select = fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte() + // //.OrderBy("a.cte_level desc") //递归层级 + // ; + //// var list = select.ToList(); //自己调试看查到的数据 + //select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + //Assert.Equal(855, fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte().Distinct().First(a => a.testint)); + + //Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + //Assert.False(fsql.Select() + // .Where(a => a.Name == "中国") + // .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -2002,6 +2018,8 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1 [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index 6839731b..4ec7bdc4 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -1800,6 +1800,22 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1813,6 +1829,8 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index bd253f74..7cf806bd 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -1875,6 +1875,22 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title"" Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1888,6 +1904,8 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title"" [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs index 8eca4e32..07176067 100644 --- a/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongSelectTest.cs @@ -1842,6 +1842,8 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE"" [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index 34377feb..429b64d9 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -1843,6 +1843,22 @@ WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT b.[Title] Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] @@ -1856,6 +1872,8 @@ WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT b.[Title] [Column(StringLength = 6)] public virtual string ParentCode { get; set; } + + public int testint { get; set; } } [Table(Name = "D_District", DisableSyncStructure = true)] public class VM_District_Child : BaseDistrict diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 7cc33e4e..fe68188f 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -1960,6 +1960,22 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title"" Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); + + var select = fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte() + //.OrderBy("a.cte_level desc") //递归层级 + ; + // var list = select.ToList(); //自己调试看查到的数据 + select.ToUpdate().Set(a => a.testint, 855).ExecuteAffrows(); + Assert.Equal(855, fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Distinct().First(a => a.testint)); + + Assert.Equal(4, select.ToDelete().ExecuteAffrows()); + Assert.False(fsql.Select() + .Where(a => a.Name == "中国") + .AsTreeCte().Any()); } [Table(Name = "D_District")] diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs index 0e99a61a..7b814ff5 100644 --- a/FreeSql.Tests/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/FreeSql.Tests/g.cs @@ -11,6 +11,7 @@ public class g static Lazy mysqlLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=5") //.UseConnectionFactory(FreeSql.DataType.MySql, () => new MySql.Data.MySqlClient.MySqlConnection("Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;")) + //.UseConnectionString(FreeSql.DataType.MySql, "Data Source=192.168.164.10;Port=33061;User ID=root;Password=root;Initial Catalog=cccddd_mysqlconnector;Charset=utf8;SslMode=none;Max pool size=10") .UseAutoSyncStructure(true) //.UseGenerateCommandParameterWithLambda(true) .UseMonitorCommand( diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index f4179e1d..5e28e3a9 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -13,17 +13,18 @@ namespace FreeSql.Internal.CommonProvider public abstract partial class DeleteProvider : IDelete where T1 : class { - protected IFreeSql _orm; - protected CommonUtils _commonUtils; - protected CommonExpression _commonExpression; - protected TableInfo _table; - protected Func _tableRule; - protected StringBuilder _where = new StringBuilder(); - protected int _whereTimes = 0; - protected List _whereGlobalFilter; - protected List _params = new List(); - protected DbTransaction _transaction; - protected DbConnection _connection; + public IFreeSql _orm; + public CommonUtils _commonUtils; + public CommonExpression _commonExpression; + public TableInfo _table; + public Func _tableRule; + public StringBuilder _where = new StringBuilder(); + public int _whereTimes = 0; + public List _whereGlobalFilter; + public List _params = new List(); + public DbTransaction _transaction; + public DbConnection _connection; + public Action _interceptSql; public DeleteProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) { @@ -155,6 +156,7 @@ namespace FreeSql.Internal.CommonProvider if (string.IsNullOrEmpty(globalFilterCondi) == false) sb.Append(" AND ").Append(globalFilterCondi); } + _interceptSql?.Invoke(sb); return sb.ToString(); } } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index b223326c..ec88baf0 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -928,43 +928,96 @@ namespace FreeSql.Internal.CommonProvider string GetToDeleteWhere(string alias) { var pks = _tables[0].Table.Primarys; - if (pks.Length == 1) - return $"{_commonUtils.QuoteSqlName(_tables[0].Table.Primarys[0].Attribute.Name)} in (select * from ({this.ToSql($"{_tables[0].Alias}.{_commonUtils.QuoteSqlName(_tables[0].Table.Primarys[0].Attribute.Name)}")}) {alias})"; - else + var old_selectVal = _select; + switch (_orm.Ado.DataType) { - var concatTypes = new Type[pks.Length * 2 - 1]; - var concatMainCols = new string[pks.Length * 2 - 1]; - var concatInCols = new string[pks.Length * 2 - 1]; - var concatSplit = _commonUtils.FormatSql("{0}", $",{alias},"); - for (var a = 0; a < pks.Length; a++) + case DataType.Dameng: + case DataType.OdbcDameng: //达梦不能这样 + case DataType.Oracle: + case DataType.OdbcOracle: + break; + default: + _select = "SELECT "; + break; + } + try + { + if (pks.Length == 1) + return $"{_commonUtils.QuoteSqlName(_tables[0].Table.Primarys[0].Attribute.Name)} in (select * from ({this.ToSql($"{_tables[0].Alias}.{_commonUtils.QuoteSqlName(_tables[0].Table.Primarys[0].Attribute.Name)}")}) {alias})"; + else { - concatTypes[a * 2] = pks[a].CsType; - concatMainCols[a * 2] = _commonUtils.QuoteSqlName(pks[a].Attribute.Name); - concatInCols[a * 2] = $"{_tables[0].Alias}.{_commonUtils.QuoteSqlName(pks[a].Attribute.Name)}"; - if (a < pks.Length - 1) + var concatTypes = new Type[pks.Length * 2 - 1]; + var concatMainCols = new string[pks.Length * 2 - 1]; + var concatInCols = new string[pks.Length * 2 - 1]; + var concatSplit = _commonUtils.FormatSql("{0}", $",{alias},"); + for (var a = 0; a < pks.Length; a++) { - concatTypes[a * 2 + 1] = typeof(string); - concatMainCols[a * 2 + 1] = concatSplit; - concatInCols[a * 2 + 1] = concatSplit; + concatTypes[a * 2] = pks[a].CsType; + concatMainCols[a * 2] = _commonUtils.QuoteSqlName(pks[a].Attribute.Name); + concatInCols[a * 2] = $"{_tables[0].Alias}.{_commonUtils.QuoteSqlName(pks[a].Attribute.Name)}"; + if (a < pks.Length - 1) + { + concatTypes[a * 2 + 1] = typeof(string); + concatMainCols[a * 2 + 1] = concatSplit; + concatInCols[a * 2 + 1] = concatSplit; + } } + return $"{_commonUtils.StringConcat(concatMainCols, concatTypes)} in (select * from ({this.ToSql($"{_commonUtils.StringConcat(concatInCols, concatTypes)} as as1")}) {alias})"; } - return $"{_commonUtils.StringConcat(concatMainCols, concatTypes)} in (select * from ({this.ToSql($"{_commonUtils.StringConcat(concatInCols, concatTypes)} as as1")}) {alias})"; + } + finally + { + _select = old_selectVal; } } public IDelete ToDelete() { if (_tables[0].Table.Primarys.Any() == false) throw new Exception($"ToDelete 功能要求实体类 {_tables[0].Table.CsName} 必须有主键"); - var del = _orm.Delete(); + var del = _orm.Delete() as DeleteProvider; if (_tables[0].Table.Type != typeof(T1)) del.AsType(_tables[0].Table.Type); if (_params.Any()) del.GetType().GetField("_params", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(del, new List(_params.ToArray())); + switch (_orm.Ado.DataType) + { + case DataType.Dameng: + case DataType.OdbcDameng: //达梦不能这样 + case DataType.Oracle: + case DataType.OdbcOracle: + break; + default: + var beforeSql = this._select; + if (beforeSql.EndsWith("SELECT ", StringComparison.OrdinalIgnoreCase)) + { + beforeSql = beforeSql.Substring(0, beforeSql.Length - 7); + if (string.IsNullOrEmpty(beforeSql) == false) + del._interceptSql = sb => sb.Insert(0, beforeSql); + } + break; + } return del.Where(GetToDeleteWhere("ftb_del")); } public IUpdate ToUpdate() { if (_tables[0].Table.Primarys.Any() == false) throw new Exception($"ToUpdate 功能要求实体类 {_tables[0].Table.CsName} 必须有主键"); - var upd = _orm.Update(); + var upd = _orm.Update() as UpdateProvider; if (_tables[0].Table.Type != typeof(T1)) upd.AsType(_tables[0].Table.Type); if (_params.Any()) upd.GetType().GetField("_params", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(upd, new List(_params.ToArray())); + switch (_orm.Ado.DataType) + { + case DataType.Dameng: + case DataType.OdbcDameng: //达梦不能这样 + case DataType.Oracle: + case DataType.OdbcOracle: + break; + default: + var beforeSql = this._select; + if (beforeSql.EndsWith("SELECT ", StringComparison.OrdinalIgnoreCase)) + { + beforeSql = beforeSql.Substring(0, beforeSql.Length - 7); + if (string.IsNullOrEmpty(beforeSql) == false) + upd._interceptSql = sb => sb.Insert(0, beforeSql); + } + break; + } return upd.Where(GetToDeleteWhere("ftb_upd")); } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 8fbf566f..93b500a3 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -35,6 +35,7 @@ namespace FreeSql.Internal.CommonProvider public Action> _batchProgress; public DbTransaction _transaction; public DbConnection _connection; + public Action _interceptSql; public UpdateProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) { @@ -766,6 +767,7 @@ namespace FreeSql.Internal.CommonProvider sb.Append(" AND ").Append(versionCondi); } + _interceptSql?.Invoke(sb); return sb.ToString(); } }