diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs index 1011a4c8d..284527d09 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSql.cs @@ -340,6 +340,16 @@ namespace SqlSugar } return result; } + + public List ToTree(string childPropertyName, string parentIdPropertyName, object rootValue, string primaryKeyPropertyName) + { + var entity = this.Context.EntityMaintenance.GetEntityInfo(); + var pk = primaryKeyPropertyName; + var list = this.ToList(); + Expression >> childListExpression = (Expression>>)ExpressionBuilderHelper.CreateExpressionSelectField(typeof(T),childPropertyName,typeof(IEnumerable)); + Expression> parentIdExpression = (Expression>)ExpressionBuilderHelper.CreateExpressionSelectFieldObject(typeof(T), parentIdPropertyName); + return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue) ?? new List(); + } public List ToTree(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, Expression> primaryKeyExpression) { var entity = this.Context.EntityMaintenance.GetEntityInfo(); diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs index 0fa733ab7..0a5383582 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableExecuteSqlAsync.cs @@ -580,6 +580,15 @@ ParameterT parameter) return result; } } + public async Task> ToTreeAsync(string childPropertyName, string parentIdPropertyName, object rootValue, string primaryKeyPropertyName) + { + var entity = this.Context.EntityMaintenance.GetEntityInfo(); + var pk = primaryKeyPropertyName; + var list =await this.ToListAsync(); + Expression>> childListExpression = (Expression>>)ExpressionBuilderHelper.CreateExpressionSelectField(typeof(T), childPropertyName, typeof(IEnumerable)); + Expression> parentIdExpression = (Expression>)ExpressionBuilderHelper.CreateExpressionSelectFieldObject(typeof(T), parentIdPropertyName); + return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue) ?? new List(); + } public async Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, object[] childIds) { var list = await this.ToListAsync(); diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index ddb96d1bb..c0d92c7a2 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -240,9 +240,10 @@ namespace SqlSugar Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue); Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue, Expression> parentWhereExpression); - + List ToTree(string childPropertyName, string parentIdPropertyName, object rootValue, string primaryKeyPropertyName); List ToTree(Expression>> childListExpression, Expression> parentIdExpression,object rootValue); List ToTree(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, Expression> primaryKeyExpression); + Task> ToTreeAsync(string childPropertyName, string parentIdPropertyName, object rootValue, string primaryKeyPropertyName); Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue); Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, Expression> primaryKeyExpression); List ToTree(Expression>> childListExpression, Expression> parentIdExpression, object rootValue, object[] childIds); diff --git a/Src/Asp.Net/SqlSugar/Utilities/ExpressionBuilderHelper.cs b/Src/Asp.Net/SqlSugar/Utilities/ExpressionBuilderHelper.cs index b87c40cc3..077c4c691 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/ExpressionBuilderHelper.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/ExpressionBuilderHelper.cs @@ -92,6 +92,19 @@ namespace SqlSugar LambdaExpression lambda = Expression.Lambda(funcType, property, parameter); return lambda; } + public static Expression CreateExpressionSelectFieldObject(Type classType, string propertyName) + { + ParameterExpression parameter = Expression.Parameter(classType, "it"); + + + PropertyInfo propertyInfo = classType.GetProperty(propertyName); + MemberExpression property = Expression.Property(parameter, propertyInfo); + + UnaryExpression convert = Expression.Convert(property, typeof(object)); + var funcType = typeof(Func<,>).MakeGenericType(classType, typeof(object)); + LambdaExpression lambda = Expression.Lambda(funcType, convert, parameter); + return lambda; + } } internal static class LinqRuntimeTypeBuilder {