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();
}
}