diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index def880b27..4368690d5 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -178,6 +178,8 @@ namespace SqlSugar Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue); 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); + Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, object[] childIds); DataTable ToDataTable(); Task ToDataTableAsync(); DataTable ToDataTablePage(int pageNumber, int pageSize); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index da1335ece..6020175dd 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs @@ -294,6 +294,11 @@ namespace SqlSugar var list = this.ToList(); return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue); } + public List ToTree(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, object[] childIds) + { + var list = this.ToList(); + return TreeAndFilterIds(childListExpression, parentIdExpression, rootValue, childIds, ref list); + } public virtual DataTable ToDataTable() { diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs index bfc8bef7d..408aec19f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs @@ -492,7 +492,11 @@ ParameterT parameter) var result = list.ToDictionary(it => it.Key.ObjToString(), it => it.Value); return result; } - + public async Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, object[] childIds) + { + var list = await this.ToListAsync(); + return TreeAndFilterIds(childListExpression, parentIdExpression, rootValue, childIds, ref list); + } public async Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue) { var entity = this.Context.EntityMaintenance.GetEntityInfo(); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index 8941e01cc..f0c59080e 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -10,7 +10,7 @@ using System.Reflection; using System.Dynamic; using System.Threading.Tasks; -namespace SqlSugar +namespace SqlSugar { public partial class QueryableProvider : QueryableAccessory, ISugarQueryable { @@ -182,18 +182,51 @@ namespace SqlSugar return result; } + private List GetPrentIds(List list, object id, EntityColumnInfo pkName, EntityColumnInfo parentName) + { + var currentId = id; + List result = new List(); + result.Add(id); + while (list.Any(it => pkName.PropertyInfo.GetValue(it).Equals(currentId))) + { + var data = list.First(it => pkName.PropertyInfo.GetValue(it).Equals(currentId)); + currentId = parentName.PropertyInfo.GetValue(data); + result.Add(currentId); + } + return result; + } + private List TreeAndFilterIds(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, object[] childIds, ref List list) + { + var entity = this.Context.EntityMaintenance.GetEntityInfo(); + var pk = GetTreeKey(entity); + var pkColumn = entity.Columns.FirstOrDefault(z => z.PropertyName == pk); + var newIds = new List(); + string parentIdName = GetParentName(parentIdExpression); + var parentColumn = entity.Columns.FirstOrDefault(z => z.PropertyName == parentIdName); + foreach (var id in childIds) + { + newIds.AddRange(GetPrentIds(list, id, pkColumn, parentColumn)); + } + list = list.Where(z => newIds.Any(it => it.Equals(pkColumn.PropertyInfo.GetValue(z)))).ToList(); + return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue); + } private List GetTreeRoot(Expression>> childListExpression, Expression> parentIdExpression, string pk, List list, object rootValue) { var childName = ((childListExpression as LambdaExpression).Body as MemberExpression).Member.Name; + string parentIdName = GetParentName(parentIdExpression); + return BuildTree(list, pk, parentIdName, childName, rootValue)?.ToList() ?? default; + } + + private static string GetParentName(Expression> parentIdExpression) + { var exp = (parentIdExpression as LambdaExpression).Body; if (exp is UnaryExpression) { exp = (exp as UnaryExpression).Operand; } var parentIdName = (exp as MemberExpression).Member.Name; - - return BuildTree(list, pk, parentIdName, childName, rootValue)?.ToList() ?? default; + return parentIdName; } private static IEnumerable BuildTree(IEnumerable list, string idName, string pIdName, string childName, object rootValue) @@ -1308,7 +1341,7 @@ namespace SqlSugar string sql = QueryBuilder.ToSqlString(); RestoreMapping(); return new KeyValuePair>(sql, QueryBuilder.Parameters); - } + } #endregion } }