mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 完善 AsTreeCte + ToUpdate/ToDelete 实现树所有子节点删除或更新;
This commit is contained in:
		@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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命令对象,在执行前
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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")]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -928,6 +928,20 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        string GetToDeleteWhere(string alias)
 | 
					        string GetToDeleteWhere(string alias)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var pks = _tables[0].Table.Primarys;
 | 
					            var pks = _tables[0].Table.Primarys;
 | 
				
			||||||
 | 
					            var old_selectVal = _select;
 | 
				
			||||||
 | 
					            switch (_orm.Ado.DataType)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case DataType.Dameng:
 | 
				
			||||||
 | 
					                case DataType.OdbcDameng: //达梦不能这样
 | 
				
			||||||
 | 
					                case DataType.Oracle:
 | 
				
			||||||
 | 
					                case DataType.OdbcOracle:
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                default:
 | 
				
			||||||
 | 
					                    _select = "SELECT ";
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            try
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
                if (pks.Length == 1)
 | 
					                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})";
 | 
					                    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
 | 
					                else
 | 
				
			||||||
@@ -951,20 +965,59 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                    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"));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user