From e3e12d2e416b5a8ba5f2bd2c8db320314e447a79 Mon Sep 17 00:00:00 2001 From: sunkaixuna <610262374@qq.com> Date: Thu, 22 Jul 2021 15:52:11 +0800 Subject: [PATCH] Add Queryable.ToChildList --- .../QueryableProvider/QueryableProvider.cs | 51 +++++++++++++++++++ Src/Asp.Net/SqlSugar/Interface/IQueryable.cs | 2 + 2 files changed, 53 insertions(+) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index d0197a383..96eac5508 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -926,6 +926,22 @@ namespace SqlSugar var list= this.ToPivotList(columnSelector, rowSelector, dataSelector); return this.Context.Utilities.SerializeObject(list); } + public List ToChildList(Expression> parentIdExpression, object primaryKeyValue) + { + var entity = this.Context.EntityMaintenance.GetEntityInfo(); + Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); + var pk = entity.Columns.Where(it => it.IsPrimarykey).First().PropertyName; + var list = this.ToList(); + return GetChildList(parentIdExpression, pk, list, primaryKeyValue); + } + public async Task> ToChildListAsync(Expression> parentIdExpression, object primaryKeyValue) + { + var entity = this.Context.EntityMaintenance.GetEntityInfo(); + Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); + var pk = entity.Columns.Where(it => it.IsPrimarykey).First().PropertyName; + var list = await this.ToListAsync(); + return GetChildList(parentIdExpression,pk,list, primaryKeyValue); + } public List ToParentList(Expression> parentIdExpression, object primaryKeyValue) { List result = new List() { }; @@ -1440,6 +1456,41 @@ namespace SqlSugar #endregion #region Private Methods + private List GetChildList(Expression> parentIdExpression, string pkName, List list, object rootValue,bool isRoot=true) + { + var exp = (parentIdExpression as LambdaExpression).Body; + if (exp is UnaryExpression) + { + exp = (exp as UnaryExpression).Operand; + } + var parentIdName = (exp as MemberExpression).Member.Name; + List result = list.Where(it => + { + var parentValue = it.GetType().GetProperty(parentIdName).GetValue(it); + return parentValue.ObjToString() == rootValue.ObjToString(); + + }).ToList(); + if (result != null && result.Count > 0) + { + List childList = new List(); + foreach (var item in result) + { + var pkValue = item.GetType().GetProperty(pkName).GetValue(item); + childList.AddRange(GetChildList(parentIdExpression, pkName, list, pkValue,false)); + } + result.AddRange(childList); + } + if (isRoot) + { + result.AddRange(list.Where(it => + { + var pkValue = it.GetType().GetProperty(pkName).GetValue(it); + return pkValue.ObjToString() == rootValue.ObjToString(); + + }).ToList()); + } + return result; + } private List GetTreeRoot(Expression>> childListExpression, Expression> parentIdExpression, string pk, List list,object rootValue) { var childName = ((childListExpression as LambdaExpression).Body as MemberExpression).Member.Name; diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index fc50d16d4..0ef8e951d 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -143,6 +143,8 @@ namespace SqlSugar string ToJsonPage(int pageIndex, int pageSize, ref int totalNumber); Task ToJsonPageAsync(int pageIndex, int pageSize, RefAsync totalNumber); KeyValuePair> ToSql(); + List ToChildList(Expression> parentIdExpression, object primaryKeyValue); + Task> ToChildListAsync(Expression> parentIdExpression, object primaryKeyValue); List ToParentList(Expression> parentIdExpression, object primaryKeyValue); Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue); List ToTree(Expression>> childListExpression, Expression> parentIdExpression,object rootValue);