From 81637c01c40f1390b7ad3df48cd3b79840d1eabf Mon Sep 17 00:00:00 2001 From: liuchao Date: Fri, 30 Sep 2022 13:39:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=90=E6=A0=91=E5=B9=B3=E9=93=BA=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2ToChildList()/ToChildListAsync()=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QueryableProvider/QueryableProvider.cs | 54 ++++++++++--------- .../QueryableProvider/QueryableProvider.cs | 54 ++++++++++--------- 2 files changed, 58 insertions(+), 50 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index db49b983d..d8799ef19 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -2418,33 +2418,37 @@ namespace SqlSugar 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()); - } + var result = BuildChildList(list, pkName, parentIdName, rootValue); return result; } + + private static List BuildChildList(List list, string idName, string pIdName, object rootValue) + { + var type = typeof(T); + var idProp = type.GetProperty(idName); + var pIdProp = type.GetProperty(pIdName); + + var kvpList = list.ToDictionary(x => x, v => idProp.GetValue(v).ObjToString()); + var groupKv = list.GroupBy(x => pIdProp.GetValue(x).ObjToString()).ToDictionary(k => k.Key, v => v.ToList()); + + Func> fc = null; + fc = (rootVal) => + { + var finalList = new List(); + if (groupKv.TryGetValue(rootVal, out var nextChildList)) + { + finalList.AddRange(nextChildList); + foreach (var child in nextChildList) + { + finalList.AddRange(fc(kvpList[child])); + } + } + return finalList; + }; + + return fc(rootValue.ObjToString()); + } + 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.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index db49b983d..12ed9879f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -2418,33 +2418,37 @@ namespace SqlSugar 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()); - } + var result = BuildChildList(list, pkName, parentIdName, rootValue); return result; } + + private static List BuildChildList(List list, string idName, string pIdName, object rootValue) + { + var type = typeof(T); + var idProp = type.GetProperty(idName); + var pIdProp = type.GetProperty(pIdName); + + var kvpList = list.ToDictionary(x => x, v => idProp.GetValue(v).ObjToString()); + var groupKv = list.GroupBy(x => pIdProp.GetValue(x).ObjToString()).ToDictionary(k => k.Key, v => v.ToList()); + + Func> fc = null; + fc = (rootValue) => + { + var finalList = new List(); + if (groupKv.TryGetValue(rootValue, out var nextChildList)) + { + finalList.AddRange(nextChildList); + foreach (var child in nextChildList) + { + finalList.AddRange(fc(kvpList[child])); + } + } + return finalList; + }; + + return fc(rootValue.ObjToString()); + } + private List GetTreeRoot(Expression>> childListExpression, Expression> parentIdExpression, string pk, List list,object rootValue) { var childName = ((childListExpression as LambdaExpression).Body as MemberExpression).Member.Name;