From 6d320ee897f0ed9002c34ca289969c83fdc4cce0 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Wed, 11 May 2022 17:38:58 +0800 Subject: [PATCH] Update ToParentList --- .../QueryableProvider/QueryableProvider.cs | 131 +++++++++++++++++- 1 file changed, 130 insertions(+), 1 deletion(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 6a2be2ada..7ee4ec866 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -1190,8 +1190,13 @@ namespace SqlSugar } public List ToParentList(Expression> parentIdExpression, object primaryKeyValue) { - List result = new List() { }; var entity = this.Context.EntityMaintenance.GetEntityInfo(); + var isTreeKey = entity.Columns.Any(it => it.IsTreeKey); + if (isTreeKey) + { + return _ToParentListByTreeKey(parentIdExpression,primaryKeyValue); + } + List result = new List() { }; Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); var parentIdName =UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name; var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName); @@ -1225,10 +1230,75 @@ namespace SqlSugar } return result; } + + private List _ToParentListByTreeKey(Expression> parentIdExpression, object primaryKeyValue) + { + var entity = this.Context.EntityMaintenance.GetEntityInfo(); + var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey); + List result = new List() { }; + var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name; + var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName); + var parentPropertyName = ParentInfo.DbColumnName; + var tableName = this.QueryBuilder.GetTableNameString; + if (this.QueryBuilder.IsSingle() == false) + { + if (this.QueryBuilder.JoinQueryInfos.Count > 0) + { + tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; + } + if (this.QueryBuilder.EasyJoinInfos.Count > 0) + { + tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; + } + } + var current = this.Context.Queryable().AS(tableName).Where(new List() { + new ConditionalModel() + { + ConditionalType = ConditionalType.Equal, + CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name, + FieldValue = primaryKeyValue + "", + FieldName = treeKey.DbColumnName + } }).First(); + if (current != null) + { + result.Add(current); + object parentId = ParentInfo.PropertyInfo.GetValue(current, null); + int i = 0; + while (parentId != null && this.Context.Queryable().AS(tableName).Where(new List() { + new ConditionalModel() + { + ConditionalType = ConditionalType.Equal, + CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name, + FieldValue = parentId + "", + FieldName = treeKey.DbColumnName + } }).Any()) + { + Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); + var parent = this.Context.Queryable().AS(tableName).Where(new List() { + new ConditionalModel() + { + ConditionalType = ConditionalType.Equal, + CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name, + FieldValue = parentId + "", + FieldName = treeKey.DbColumnName + } }).First(); + result.Add(parent); + parentId = ParentInfo.PropertyInfo.GetValue(parent, null); + ++i; + } + } + return result; + } + public async Task> ToParentListAsync(Expression> parentIdExpression, object primaryKeyValue) { 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); + } Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name; var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName); @@ -1262,6 +1332,65 @@ namespace SqlSugar } return result; } + private async Task> _ToParentListByTreeKeyAsync(Expression> parentIdExpression, object primaryKeyValue) + { + var entity = this.Context.EntityMaintenance.GetEntityInfo(); + var treeKey = entity.Columns.FirstOrDefault(it => it.IsTreeKey); + List result = new List() { }; + var parentIdName = UtilConvert.ToMemberExpression((parentIdExpression as LambdaExpression).Body).Member.Name; + var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName); + var parentPropertyName = ParentInfo.DbColumnName; + var tableName = this.QueryBuilder.GetTableNameString; + if (this.QueryBuilder.IsSingle() == false) + { + if (this.QueryBuilder.JoinQueryInfos.Count > 0) + { + tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; + } + if (this.QueryBuilder.EasyJoinInfos.Count > 0) + { + tableName = this.QueryBuilder.JoinQueryInfos.First().TableName; + } + } + var current = await this.Context.Queryable().AS(tableName).Where(new List() { + new ConditionalModel() + { + ConditionalType = ConditionalType.Equal, + CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name, + FieldValue = primaryKeyValue + "", + FieldName = treeKey.DbColumnName + } }).FirstAsync(); + 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).Where(new List() { + new ConditionalModel() + { + ConditionalType = ConditionalType.Equal, + CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name, + FieldValue = parentId + "", + FieldName = treeKey.DbColumnName + } }).AnyAsync()) + { + Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限(100),检查最顶层的ParentId是否是null或者0")); + var parent = await this.Context.Queryable().AS(tableName).Where(new List() { + new ConditionalModel() + { + ConditionalType = ConditionalType.Equal, + CSharpTypeName = treeKey.PropertyInfo.PropertyType.Name, + FieldValue = parentId + "", + FieldName = treeKey.DbColumnName + } }).FirstAsync(); + result.Add(parent); + parentId = ParentInfo.PropertyInfo.GetValue(parent, null); + ++i; + } + } + return result; + } + public List ToTree(Expression>> childListExpression, Expression> parentIdExpression, object rootValue) { var entity = this.Context.EntityMaintenance.GetEntityInfo();