diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index d19ff57f8..83c60d05a 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs @@ -245,13 +245,13 @@ namespace SqlSugar return GetChildList(parentIdExpression, pk, list, primaryKeyValue, isContainOneself); } - public List ToParentList(Expression> parentIdExpression, object primaryKeyValue) + public List ToParentList(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default) { var entity = this.Context.EntityMaintenance.GetEntityInfo(); var isTreeKey = entity.Columns.Any(it => it.IsTreeKey); if (isTreeKey) { - return _ToParentListByTreeKey(parentIdExpression, primaryKeyValue); + return _ToParentListByTreeKey(parentIdExpression, primaryKeyValue,parentWhereExpression); } List result = new List() { }; Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); @@ -270,16 +270,16 @@ namespace SqlSugar tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; } } - var current = this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(primaryKeyValue); + var current = this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(primaryKeyValue); if (current != null) { result.Add(current); object parentId = ParentInfo.PropertyInfo.GetValue(current, null); int i = 0; - while (parentId != null && this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).Any()) + while (parentId != null && this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).Any()) { Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); - var parent = this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(parentId); + var parent = this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(parentId); result.Add(parent); parentId = ParentInfo.PropertyInfo.GetValue(parent, null); ++i; diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs index cd30b3732..91cf471bf 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs @@ -505,14 +505,14 @@ ParameterT parameter) return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue); } - public async Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue) + public async Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default) { List result = new List() { }; var entity = this.Context.EntityMaintenance.GetEntityInfo(); var isTreeKey = entity.Columns.Any(it => it.IsTreeKey); if (isTreeKey) { - return await _ToParentListByTreeKeyAsync(parentIdExpression, primaryKeyValue); + return await _ToParentListByTreeKeyAsync(parentIdExpression, primaryKeyValue,parentWhereExpression); } Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name; @@ -530,16 +530,16 @@ ParameterT parameter) tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; } } - var current = await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingleAsync(primaryKeyValue); + var current = await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingleAsync(primaryKeyValue); if (current != null) { result.Add(current); object parentId = ParentInfo.PropertyInfo.GetValue(current, null); int i = 0; - while (parentId != null && await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).AnyAsync()) + while (parentId != null && await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).AnyAsync()) { Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); - var parent = await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingleAsync(parentId); + var parent = await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingleAsync(parentId); result.Add(parent); parentId = ParentInfo.PropertyInfo.GetValue(parent, null); ++i; diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index 7c6f239b7..e99c66e5e 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -20,7 +20,7 @@ namespace SqlSugar public partial class QueryableProvider : QueryableAccessory, ISugarQueryable { #region Tree - private List _ToParentListByTreeKey(Expression> parentIdExpression, object primaryKeyValue) + private List _ToParentListByTreeKey(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default) { var entity = this.Context.EntityMaintenance.GetEntityInfo(); var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey); @@ -40,7 +40,7 @@ namespace SqlSugar tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; } } - var current = this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + var current = this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -53,7 +53,7 @@ namespace SqlSugar result.Add(current); object parentId = ParentInfo.PropertyInfo.GetValue(current, null); int i = 0; - while (parentId != null && this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + while (parentId != null && this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -63,7 +63,7 @@ namespace SqlSugar } }).Any()) { Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); - var parent = this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + var parent = this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -79,7 +79,7 @@ namespace SqlSugar return result; } - private async Task> _ToParentListByTreeKeyAsync(Expression> parentIdExpression, object primaryKeyValue) + private async Task> _ToParentListByTreeKeyAsync(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default) { var entity = this.Context.EntityMaintenance.GetEntityInfo(); var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey); @@ -99,7 +99,7 @@ namespace SqlSugar tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; } } - var current = await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + var current = await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -112,7 +112,7 @@ namespace SqlSugar result.Add(current); object parentId = ParentInfo.PropertyInfo.GetValue(current, null); int i = 0; - while (parentId != null && await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + while (parentId != null && await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -122,7 +122,7 @@ namespace SqlSugar } }).AnyAsync()) { Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); - var parent = await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + var parent = await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index 171f0eab3..8f4dff2ba 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -178,8 +178,8 @@ namespace SqlSugar string ToSqlString(); List ToChildList(Expression> parentIdExpression, object primaryKeyValue, bool isContainOneself = true); Task> ToChildListAsync(Expression> parentIdExpression, object primaryKeyValue, bool isContainOneself = true); - List ToParentList(Expression> parentIdExpression, object primaryKeyValue); - Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue); + List ToParentList(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default); + Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default); List ToTree(Expression>> childListExpression, Expression> parentIdExpression,object rootValue); Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue); List ToTree(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, object[] childIds); diff --git a/Src/Asp.NetCore2/MySqlTest/Demo/DemoH_Tree.cs b/Src/Asp.NetCore2/MySqlTest/Demo/DemoH_Tree.cs new file mode 100644 index 000000000..de0feab86 --- /dev/null +++ b/Src/Asp.NetCore2/MySqlTest/Demo/DemoH_Tree.cs @@ -0,0 +1,75 @@ +using OrmTest; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySqlTest.Demo +{ + public class DemoH_Tree + { + public static void Init() + { + Task.Run(Test_ToParentList).Wait(); + } + private static async Task Test_ToParentList() + { + var db = GetInstance(); + var data = await db.Queryable().ToParentListAsync(x => x.ParentCode, 2, x => x.TemplateId == 1611933284013932544); + } + + private static SqlSugarClient GetInstance() + { + return new SqlSugarClient(new ConnectionConfig() + { + DbType = SqlSugar.DbType.MySql, + ConnectionString = Config.ConnectionString, + InitKeyType = InitKeyType.Attribute, + IsAutoCloseConnection = true, + AopEvents = new AopEvents + { + OnLogExecuting = (sql, p) => + { + Console.WriteLine(sql); + Console.WriteLine(string.Join(",", p?.Select(it => it.ParameterName + ":" + it.Value))); + } + } + }); + } + } + + [SugarTable("customer_address_template_detail", TableDescription = "客户地址模板详情")] + [SugarIndex("idx_code", nameof(Code), OrderByType.Asc)] + public class CustomerAddressTemplateDetail + { + [SugarColumn(IsPrimaryKey = true)] + public long Id { get; set; } + /// + /// 模板id + /// + [SugarColumn(ColumnDescription = "模板id")] + public long TemplateId { get; set; } + + [SugarColumn(ColumnDescription = "地址", Length = 128,IsTreeKey = true)] + public string Code { get; set; } = string.Empty; + + [SugarColumn(ColumnDescription = "上级地址", Length = 128)] + public string ParentCode { get; set; } = string.Empty; + + [SugarColumn(ColumnDescription = "名称", Length = 256)] + public string Name { get; set; } = string.Empty; + + [SugarColumn(ColumnDescription = "级别")] + public int Level { get; set; } + + [SugarColumn(ColumnDescription = "得力末级地址")] + public long DistrictId { get; set; } + + + } + + +} diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index d19ff57f8..c1292c8c3 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs @@ -245,13 +245,13 @@ namespace SqlSugar return GetChildList(parentIdExpression, pk, list, primaryKeyValue, isContainOneself); } - public List ToParentList(Expression> parentIdExpression, object primaryKeyValue) + public List ToParentList(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default) { var entity = this.Context.EntityMaintenance.GetEntityInfo(); var isTreeKey = entity.Columns.Any(it => it.IsTreeKey); if (isTreeKey) { - return _ToParentListByTreeKey(parentIdExpression, primaryKeyValue); + return _ToParentListByTreeKey(parentIdExpression, primaryKeyValue,parentWhereExpression); } List result = new List() { }; Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); @@ -270,16 +270,16 @@ namespace SqlSugar tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; } } - var current = this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(primaryKeyValue); + var current = this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(primaryKeyValue); if (current != null) { result.Add(current); object parentId = ParentInfo.PropertyInfo.GetValue(current, null); int i = 0; - while (parentId != null && this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).Any()) + while (parentId != null && this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).Any()) { Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); - var parent = this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(parentId); + var parent = this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingle(parentId); result.Add(parent); parentId = ParentInfo.PropertyInfo.GetValue(parent, null); ++i; diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs index cd30b3732..f2aeeb4b5 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs @@ -505,14 +505,14 @@ ParameterT parameter) return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue); } - public async Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue) + public async Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default) { List result = new List() { }; var entity = this.Context.EntityMaintenance.GetEntityInfo(); var isTreeKey = entity.Columns.Any(it => it.IsTreeKey); if (isTreeKey) { - return await _ToParentListByTreeKeyAsync(parentIdExpression, primaryKeyValue); + return await _ToParentListByTreeKeyAsync(parentIdExpression, primaryKeyValue, parentWhereExpression); } Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name; @@ -530,16 +530,16 @@ ParameterT parameter) tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; } } - var current = await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingleAsync(primaryKeyValue); + var current = await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingleAsync(primaryKeyValue); if (current != null) { result.Add(current); object parentId = ParentInfo.PropertyInfo.GetValue(current, null); int i = 0; - while (parentId != null && await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).AnyAsync()) + while (parentId != null && await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).In(parentId).AnyAsync()) { Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); - var parent = await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingleAsync(parentId); + var parent = await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).InSingleAsync(parentId); result.Add(parent); parentId = ParentInfo.PropertyInfo.GetValue(parent, null); ++i; diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index 7c6f239b7..a45909f61 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -20,7 +20,7 @@ namespace SqlSugar public partial class QueryableProvider : QueryableAccessory, ISugarQueryable { #region Tree - private List _ToParentListByTreeKey(Expression> parentIdExpression, object primaryKeyValue) + private List _ToParentListByTreeKey(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default) { var entity = this.Context.EntityMaintenance.GetEntityInfo(); var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey); @@ -40,7 +40,7 @@ namespace SqlSugar tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; } } - var current = this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + var current = this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -53,7 +53,7 @@ namespace SqlSugar result.Add(current); object parentId = ParentInfo.PropertyInfo.GetValue(current, null); int i = 0; - while (parentId != null && this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + while (parentId != null && this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -63,7 +63,7 @@ namespace SqlSugar } }).Any()) { Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); - var parent = this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + var parent = this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -79,7 +79,7 @@ namespace SqlSugar return result; } - private async Task> _ToParentListByTreeKeyAsync(Expression> parentIdExpression, object primaryKeyValue) + private async Task> _ToParentListByTreeKeyAsync(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default) { var entity = this.Context.EntityMaintenance.GetEntityInfo(); var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey); @@ -99,7 +99,7 @@ namespace SqlSugar tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; } } - var current = await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + var current = await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression!=default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -112,7 +112,7 @@ namespace SqlSugar result.Add(current); object parentId = ParentInfo.PropertyInfo.GetValue(current, null); int i = 0; - while (parentId != null && await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + while (parentId != null && await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, @@ -122,7 +122,7 @@ namespace SqlSugar } }).AnyAsync()) { Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); - var parent = await this.Context.Queryable().AS(tableName).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { + var parent = await this.Context.Queryable().AS(tableName).WhereIF(parentWhereExpression != default, parentWhereExpression).Filter(null, this.QueryBuilder.IsDisabledGobalFilter).Where(new List() { new ConditionalModel() { ConditionalType = ConditionalType.Equal, diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs index 171f0eab3..8f4dff2ba 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs @@ -178,8 +178,8 @@ namespace SqlSugar string ToSqlString(); List ToChildList(Expression> parentIdExpression, object primaryKeyValue, bool isContainOneself = true); Task> ToChildListAsync(Expression> parentIdExpression, object primaryKeyValue, bool isContainOneself = true); - List ToParentList(Expression> parentIdExpression, object primaryKeyValue); - Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue); + List ToParentList(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default); + Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression = default); List ToTree(Expression>> childListExpression, Expression> parentIdExpression,object rootValue); Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue); List ToTree(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, object[] childIds);