- 完善 AsTreeCte + ToUpdate/ToDelete 实现树所有子节点删除或更新;

This commit is contained in:
28810 2020-08-04 20:54:15 +08:00
parent 255cbf33aa
commit 18cabd22b9
24 changed files with 346 additions and 63 deletions

View File

@ -567,11 +567,13 @@ namespace FreeSql
/// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para> /// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para>
/// 注意:* 本方法只支持单表操作,不支持导航属性级联保存 /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存
/// </summary> /// </summary>
/// <param name="data">可选参数:手工传递最终的 data 值进行对比<para></para>默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比</param>
/// <returns></returns> /// <returns></returns>
public int EndEdit() public int EndEdit(List<TEntity> data = null)
{ {
if (data == null) data = _dataEditing;
var beforeAffrows = 0; var beforeAffrows = 0;
if (_dataEditing == null) return 0; if (data == null) return 0;
var oldEnable = _db.Options.EnableAddOrUpdateNavigateList; var oldEnable = _db.Options.EnableAddOrUpdateNavigateList;
_db.Options.EnableAddOrUpdateNavigateList = false; _db.Options.EnableAddOrUpdateNavigateList = false;
try try
@ -579,7 +581,7 @@ namespace FreeSql
DbContextFlushCommand(); DbContextFlushCommand();
var addList = new List<TEntity>(); var addList = new List<TEntity>();
var ediList = new List<NativeTuple<TEntity, string>>(); var ediList = new List<NativeTuple<TEntity, string>>();
foreach (var item in _dataEditing) foreach (var item in data)
{ {
var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false); var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false);
if (_statesEditing.TryRemove(key, out var state) == false) if (_statesEditing.TryRemove(key, out var state) == false)

View File

@ -125,13 +125,6 @@
清空状态数据 清空状态数据
</summary> </summary>
</member> </member>
<member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
<summary>
根据 lambda 条件删除数据
</summary>
<param name="predicate"></param>
<returns></returns>
</member>
<member name="M:FreeSql.DbSet`1.Add(`0)"> <member name="M:FreeSql.DbSet`1.Add(`0)">
<summary> <summary>
添加 添加
@ -183,12 +176,13 @@
</summary> </summary>
<param name="data"></param> <param name="data"></param>
</member> </member>
<member name="M:FreeSql.DbSet`1.EndEdit"> <member name="M:FreeSql.DbSet`1.EndEdit(System.Collections.Generic.List{`0})">
<summary> <summary>
完成编辑数据,进行保存动作<para></para> 完成编辑数据,进行保存动作<para></para>
该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para> 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para>
注意:* 本方法只支持单表操作,不支持导航属性级联保存 注意:* 本方法只支持单表操作,不支持导航属性级联保存
</summary> </summary>
<param name="data">可选参数:手工传递最终的 data 值进行对比<para></para>默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreColumnFluent.Help"> <member name="M:FreeSql.Extensions.EfCoreFluentApi.EfCoreColumnFluent.Help">
@ -330,12 +324,13 @@
</summary> </summary>
<param name="data"></param> <param name="data"></param>
</member> </member>
<member name="M:FreeSql.IBaseRepository`1.EndEdit"> <member name="M:FreeSql.IBaseRepository`1.EndEdit(System.Collections.Generic.List{`0})">
<summary> <summary>
完成编辑数据,进行保存动作<para></para> 完成编辑数据,进行保存动作<para></para>
该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para> 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para>
注意:* 本方法只支持单表操作,不支持导航属性级联保存 注意:* 本方法只支持单表操作,不支持导航属性级联保存
</summary> </summary>
<param name="data">可选参数:手工传递最终的 data 值进行对比<para></para>默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:FreeSql.IUnitOfWork"> <member name="T:FreeSql.IUnitOfWork">
@ -520,14 +515,5 @@
<param name="that"></param> <param name="that"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="globalDataFilter"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
</members> </members>
</doc> </doc>

View File

@ -142,7 +142,7 @@ namespace FreeSql
} }
public void BeginEdit(List<TEntity> data) => _dbset.BeginEdit(data); public void BeginEdit(List<TEntity> data) => _dbset.BeginEdit(data);
public int EndEdit() public int EndEdit(List<TEntity> data = null)
{ {
_db.FlushCommand(); _db.FlushCommand();
if (UnitOfWork?.GetOrBeginTransaction(true) == null && _db.OrmOriginal.Ado.TransactionCurrentThread == null) if (UnitOfWork?.GetOrBeginTransaction(true) == null && _db.OrmOriginal.Ado.TransactionCurrentThread == null)
@ -152,7 +152,7 @@ namespace FreeSql
UnitOfWork = new UnitOfWork(_db.OrmOriginal); UnitOfWork = new UnitOfWork(_db.OrmOriginal);
try try
{ {
affrows = _dbset.EndEdit(); affrows = _dbset.EndEdit(data);
UnitOfWork.Commit(); UnitOfWork.Commit();
} }
catch catch
@ -167,7 +167,7 @@ namespace FreeSql
} }
return affrows; return affrows;
} }
return _dbset.EndEdit(); return _dbset.EndEdit(data);
} }
} }

View File

@ -92,8 +92,9 @@ namespace FreeSql
/// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para> /// 该方法根据 BeginEdit 传入的数据状态分析出添加、修改、删除 SQL 语句<para></para>
/// 注意:* 本方法只支持单表操作,不支持导航属性级联保存 /// 注意:* 本方法只支持单表操作,不支持导航属性级联保存
/// </summary> /// </summary>
/// <param name="data">可选参数:手工传递最终的 data 值进行对比<para></para>默认:如果不传递,则使用 BeginEdit 传入的 data 引用进行对比</param>
/// <returns></returns> /// <returns></returns>
int EndEdit(); int EndEdit(List<TEntity> data = null);
#if net40 #if net40
#else #else

View File

@ -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("110100", t3[0].Childs[0].Childs[0].Code);
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList();
//Assert.Single(t3); //Assert.Single(t3);
//Assert.Equal("100000", t3[0].Code); //Assert.Equal("100000", t3[0].Code);
//Assert.Single(t3[0].Childs); //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("110100", t3[0].Childs[0].Childs[0].Code);
//Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); //Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
//Assert.Equal(4, t3.Count); //Assert.Equal(4, t3.Count);
//Assert.Equal("100000", t3[0].Code); //Assert.Equal("100000", t3[0].Code);
//Assert.Equal("110000", t3[1].Code); //Assert.Equal("110000", t3[1].Code);
//Assert.Equal("110100", t3[2].Code); //Assert.Equal("110100", t3[2].Code);
//Assert.Equal("110101", t3[3].Code); //Assert.Equal("110101", t3[3].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList();
//Assert.Equal(3, t3.Count); //Assert.Equal(3, t3.Count);
//Assert.Equal("110000", t3[0].Code); //Assert.Equal("110000", t3[0].Code);
//Assert.Equal("110100", t3[1].Code); //Assert.Equal("110100", t3[1].Code);
//Assert.Equal("110101", t3[2].Code); //Assert.Equal("110101", t3[2].Code);
//var select = fsql.Select<VM_District_Child>()
// .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<VM_District_Child>()
// .Where(a => a.Name == "中国")
// .AsTreeCte().Distinct().First(a => a.testint));
//Assert.Equal(4, select.ToDelete().ExecuteAffrows());
//Assert.False(fsql.Select<VM_District_Child>()
// .Where(a => a.Name == "中国")
// .AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1938,6 +1954,8 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -10,6 +10,7 @@ public class g
static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder() static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => 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") .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;")) //.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) .UseAutoSyncStructure(true)
//.UseGenerateCommandParameterWithLambda(true) //.UseGenerateCommandParameterWithLambda(true)
.UseMonitorCommand( .UseMonitorCommand(

View File

@ -1808,6 +1808,22 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1821,6 +1837,8 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -1764,6 +1764,22 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE""
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1777,6 +1793,8 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE""
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -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("110100", t3[0].Childs[0].Childs[0].Code);
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList();
//Assert.Single(t3); //Assert.Single(t3);
//Assert.Equal("100000", t3[0].Code); //Assert.Equal("100000", t3[0].Code);
//Assert.Single(t3[0].Childs); //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("110100", t3[0].Childs[0].Childs[0].Code);
//Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); //Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
//Assert.Equal(4, t3.Count); //Assert.Equal(4, t3.Count);
//Assert.Equal("100000", t3[0].Code); //Assert.Equal("100000", t3[0].Code);
//Assert.Equal("110000", t3[1].Code); //Assert.Equal("110000", t3[1].Code);
//Assert.Equal("110100", t3[2].Code); //Assert.Equal("110100", t3[2].Code);
//Assert.Equal("110101", t3[3].Code); //Assert.Equal("110101", t3[3].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList();
//Assert.Equal(3, t3.Count); //Assert.Equal(3, t3.Count);
//Assert.Equal("110000", t3[0].Code); //Assert.Equal("110000", t3[0].Code);
//Assert.Equal("110100", t3[1].Code); //Assert.Equal("110100", t3[1].Code);
//Assert.Equal("110101", t3[2].Code); //Assert.Equal("110101", t3[2].Code);
//var select = fsql.Select<VM_District_Child>()
// .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<VM_District_Child>()
// .Where(a => a.Name == "中国")
// .AsTreeCte().Distinct().First(a => a.testint));
//Assert.Equal(4, select.ToDelete().ExecuteAffrows());
//Assert.False(fsql.Select<VM_District_Child>()
// .Where(a => a.Name == "中国")
// .AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1949,6 +1965,8 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -1800,6 +1800,22 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1813,6 +1829,8 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -1859,6 +1859,22 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title""
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1872,6 +1888,8 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title""
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -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]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1763,6 +1779,8 @@ WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT b.[Title]
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -9,6 +9,7 @@ public class g
static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder() static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => 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") .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;")) //.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) .UseAutoSyncStructure(true)
.UseMonitorCommand( .UseMonitorCommand(
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象在执行前 cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象在执行前

View File

@ -1809,6 +1809,22 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1822,6 +1838,8 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -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("110100", t3[0].Childs[0].Childs[0].Code);
Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToTreeList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToTreeList();
//Assert.Single(t3); //Assert.Single(t3);
//Assert.Equal("100000", t3[0].Code); //Assert.Equal("100000", t3[0].Code);
//Assert.Single(t3[0].Childs); //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("110100", t3[0].Childs[0].Childs[0].Code);
//Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code); //Assert.Equal("110101", t3[0].Childs[0].Childs[1].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsCteTree().OrderBy(a => a.Code).ToList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "中国").AsTreeCte().OrderBy(a => a.Code).ToList();
//Assert.Equal(4, t3.Count); //Assert.Equal(4, t3.Count);
//Assert.Equal("100000", t3[0].Code); //Assert.Equal("100000", t3[0].Code);
//Assert.Equal("110000", t3[1].Code); //Assert.Equal("110000", t3[1].Code);
//Assert.Equal("110100", t3[2].Code); //Assert.Equal("110100", t3[2].Code);
//Assert.Equal("110101", t3[3].Code); //Assert.Equal("110101", t3[3].Code);
//t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsCteTree().OrderBy(a => a.Code).ToList(); //t3 = fsql.Select<VM_District_Child>().Where(a => a.Name == "北京").AsTreeCte().OrderBy(a => a.Code).ToList();
//Assert.Equal(3, t3.Count); //Assert.Equal(3, t3.Count);
//Assert.Equal("110000", t3[0].Code); //Assert.Equal("110000", t3[0].Code);
//Assert.Equal("110100", t3[1].Code); //Assert.Equal("110100", t3[1].Code);
//Assert.Equal("110101", t3[2].Code); //Assert.Equal("110101", t3[2].Code);
//var select = fsql.Select<VM_District_Child>()
// .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<VM_District_Child>()
// .Where(a => a.Name == "中国")
// .AsTreeCte().Distinct().First(a => a.testint));
//Assert.Equal(4, select.ToDelete().ExecuteAffrows());
//Assert.False(fsql.Select<VM_District_Child>()
// .Where(a => a.Name == "中国")
// .AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -2002,6 +2018,8 @@ WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql1
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -1800,6 +1800,22 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1813,6 +1829,8 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE""
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -1875,6 +1875,22 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title""
Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path); Assert.Equal("中国[100000] -> 北京[110000]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1888,6 +1904,8 @@ WHERE ((((a.""id"")::text) in (SELECT b.""title""
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -1842,6 +1842,8 @@ WHERE ((((a.""ID"")::text) in (SELECT b.""TITLE""
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -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]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]
@ -1856,6 +1872,8 @@ WHERE (((cast(a.[Id] as nvarchar(100))) in (SELECT b.[Title]
[Column(StringLength = 6)] [Column(StringLength = 6)]
public virtual string ParentCode { get; set; } public virtual string ParentCode { get; set; }
public int testint { get; set; }
} }
[Table(Name = "D_District", DisableSyncStructure = true)] [Table(Name = "D_District", DisableSyncStructure = true)]
public class VM_District_Child : BaseDistrict public class VM_District_Child : BaseDistrict

View File

@ -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]", t4[1].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path); Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path);
Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path);
var select = fsql.Select<VM_District_Child>()
.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<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Distinct().First(a => a.testint));
Assert.Equal(4, select.ToDelete().ExecuteAffrows());
Assert.False(fsql.Select<VM_District_Child>()
.Where(a => a.Name == "中国")
.AsTreeCte().Any());
} }
[Table(Name = "D_District")] [Table(Name = "D_District")]

View File

@ -11,6 +11,7 @@ public class g
static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder() static Lazy<IFreeSql> mysqlLazy = new Lazy<IFreeSql>(() => 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") .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;")) //.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) .UseAutoSyncStructure(true)
//.UseGenerateCommandParameterWithLambda(true) //.UseGenerateCommandParameterWithLambda(true)
.UseMonitorCommand( .UseMonitorCommand(

View File

@ -13,17 +13,18 @@ namespace FreeSql.Internal.CommonProvider
public abstract partial class DeleteProvider<T1> : IDelete<T1> where T1 : class public abstract partial class DeleteProvider<T1> : IDelete<T1> where T1 : class
{ {
protected IFreeSql _orm; public IFreeSql _orm;
protected CommonUtils _commonUtils; public CommonUtils _commonUtils;
protected CommonExpression _commonExpression; public CommonExpression _commonExpression;
protected TableInfo _table; public TableInfo _table;
protected Func<string, string> _tableRule; public Func<string, string> _tableRule;
protected StringBuilder _where = new StringBuilder(); public StringBuilder _where = new StringBuilder();
protected int _whereTimes = 0; public int _whereTimes = 0;
protected List<GlobalFilter.Item> _whereGlobalFilter; public List<GlobalFilter.Item> _whereGlobalFilter;
protected List<DbParameter> _params = new List<DbParameter>(); public List<DbParameter> _params = new List<DbParameter>();
protected DbTransaction _transaction; public DbTransaction _transaction;
protected DbConnection _connection; public DbConnection _connection;
public Action<StringBuilder> _interceptSql;
public DeleteProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) public DeleteProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere)
{ {
@ -155,6 +156,7 @@ namespace FreeSql.Internal.CommonProvider
if (string.IsNullOrEmpty(globalFilterCondi) == false) if (string.IsNullOrEmpty(globalFilterCondi) == false)
sb.Append(" AND ").Append(globalFilterCondi); sb.Append(" AND ").Append(globalFilterCondi);
} }
_interceptSql?.Invoke(sb);
return sb.ToString(); return sb.ToString();
} }
} }

View File

@ -928,43 +928,96 @@ namespace FreeSql.Internal.CommonProvider
string GetToDeleteWhere(string alias) string GetToDeleteWhere(string alias)
{ {
var pks = _tables[0].Table.Primarys; var pks = _tables[0].Table.Primarys;
if (pks.Length == 1) var old_selectVal = _select;
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})"; switch (_orm.Ado.DataType)
else
{ {
var concatTypes = new Type[pks.Length * 2 - 1]; case DataType.Dameng:
var concatMainCols = new string[pks.Length * 2 - 1]; case DataType.OdbcDameng: //达梦不能这样
var concatInCols = new string[pks.Length * 2 - 1]; case DataType.Oracle:
var concatSplit = _commonUtils.FormatSql("{0}", $",{alias},"); case DataType.OdbcOracle:
for (var a = 0; a < pks.Length; a++) 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; var concatTypes = new Type[pks.Length * 2 - 1];
concatMainCols[a * 2] = _commonUtils.QuoteSqlName(pks[a].Attribute.Name); var concatMainCols = new string[pks.Length * 2 - 1];
concatInCols[a * 2] = $"{_tables[0].Alias}.{_commonUtils.QuoteSqlName(pks[a].Attribute.Name)}"; var concatInCols = new string[pks.Length * 2 - 1];
if (a < pks.Length - 1) var concatSplit = _commonUtils.FormatSql("{0}", $",{alias},");
for (var a = 0; a < pks.Length; a++)
{ {
concatTypes[a * 2 + 1] = typeof(string); concatTypes[a * 2] = pks[a].CsType;
concatMainCols[a * 2 + 1] = concatSplit; concatMainCols[a * 2] = _commonUtils.QuoteSqlName(pks[a].Attribute.Name);
concatInCols[a * 2 + 1] = concatSplit; 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<T1> ToDelete() public IDelete<T1> ToDelete()
{ {
if (_tables[0].Table.Primarys.Any() == false) throw new Exception($"ToDelete 功能要求实体类 {_tables[0].Table.CsName} 必须有主键"); if (_tables[0].Table.Primarys.Any() == false) throw new Exception($"ToDelete 功能要求实体类 {_tables[0].Table.CsName} 必须有主键");
var del = _orm.Delete<T1>(); var del = _orm.Delete<T1>() as DeleteProvider<T1>;
if (_tables[0].Table.Type != typeof(T1)) del.AsType(_tables[0].Table.Type); 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<DbParameter>(_params.ToArray())); if (_params.Any()) del.GetType().GetField("_params", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(del, new List<DbParameter>(_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")); return del.Where(GetToDeleteWhere("ftb_del"));
} }
public IUpdate<T1> ToUpdate() public IUpdate<T1> ToUpdate()
{ {
if (_tables[0].Table.Primarys.Any() == false) throw new Exception($"ToUpdate 功能要求实体类 {_tables[0].Table.CsName} 必须有主键"); if (_tables[0].Table.Primarys.Any() == false) throw new Exception($"ToUpdate 功能要求实体类 {_tables[0].Table.CsName} 必须有主键");
var upd = _orm.Update<T1>(); var upd = _orm.Update<T1>() as UpdateProvider<T1>;
if (_tables[0].Table.Type != typeof(T1)) upd.AsType(_tables[0].Table.Type); 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<DbParameter>(_params.ToArray())); if (_params.Any()) upd.GetType().GetField("_params", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(upd, new List<DbParameter>(_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")); return upd.Where(GetToDeleteWhere("ftb_upd"));
} }

View File

@ -35,6 +35,7 @@ namespace FreeSql.Internal.CommonProvider
public Action<BatchProgressStatus<T1>> _batchProgress; public Action<BatchProgressStatus<T1>> _batchProgress;
public DbTransaction _transaction; public DbTransaction _transaction;
public DbConnection _connection; public DbConnection _connection;
public Action<StringBuilder> _interceptSql;
public UpdateProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) public UpdateProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere)
{ {
@ -766,6 +767,7 @@ namespace FreeSql.Internal.CommonProvider
sb.Append(" AND ").Append(versionCondi); sb.Append(" AND ").Append(versionCondi);
} }
_interceptSql?.Invoke(sb);
return sb.ToString(); return sb.ToString();
} }
} }