From 3288457cee5313d3dfa1dc357f06b83443f5ad90 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Wed, 11 May 2022 18:15:15 +0800 Subject: [PATCH] Update Core --- .../EntityMaintenance/EntityMaintenance.cs | 1 + .../QueryableProvider/QueryableProvider.cs | 154 ++++++++++++++++-- .../SqlSugar/Entities/EntityColumnInfo.cs | 1 + .../Entities/Mapping/SugarMappingAttribute.cs | 6 + 4 files changed, 152 insertions(+), 10 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs index 315be263b..9703bf32c 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs @@ -280,6 +280,7 @@ namespace SqlSugar column.UIndexGroupNameList = sugarColumn.UniqueGroupNameList; column.IsOnlyIgnoreUpdate = sugarColumn.IsOnlyIgnoreUpdate; column.IsArray = sugarColumn.IsArray; + column.IsTreeKey = sugarColumn.IsTreeKey; } else { diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 08284c977..d13a76463 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -1047,7 +1047,8 @@ namespace SqlSugar if (this.QueryBuilder.Skip == null&& this.QueryBuilder.Take == null&& this.QueryBuilder.OrderByValue == null && - this.QueryBuilder.PartitionByValue == null) + this.QueryBuilder.PartitionByValue == null&& + this.QueryBuilder.SelectValue==null) { return this.Clone().Select(" COUNT(1) ").ToList().First(); @@ -1177,23 +1178,26 @@ namespace SqlSugar 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 pk = GetTreeKey(entity); 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 pk = GetTreeKey(entity); var list = await this.ToListAsync(); return GetChildList(parentIdExpression,pk,list, primaryKeyValue); } 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); @@ -1227,10 +1231,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); @@ -1264,11 +1333,69 @@ 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(); - Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key"); - var pk = entity.Columns.Where(it => it.IsPrimarykey).First().PropertyName; + var pk = GetTreeKey(entity); var list = this.ToList(); return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue); } @@ -1276,8 +1403,7 @@ namespace SqlSugar public async Task> ToTreeAsync(Expression>> childListExpression, Expression> parentIdExpression, object rootValue) { 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 pk = GetTreeKey(entity); ; var list =await this.ToListAsync(); return GetTreeRoot(childListExpression, parentIdExpression, pk, list,rootValue); } @@ -2215,6 +2341,14 @@ namespace SqlSugar QueryBuilder.IsCount = true; result = 0; } + private static string GetTreeKey(EntityInfo entity) + { + Check.Exception(entity.Columns.Where(it => it.IsPrimarykey || it.IsTreeKey).Count() == 0, "need IsPrimary=true Or IsTreeKey=true"); + string pk = entity.Columns.Where(it => it.IsTreeKey).FirstOrDefault()?.PropertyName; + if (pk == null) + pk = entity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault()?.PropertyName; + return pk; + } protected ISugarQueryable _Select(Expression expression) { QueryBuilder.CheckExpression(expression, "Select"); diff --git a/Src/Asp.NetCore2/SqlSugar/Entities/EntityColumnInfo.cs b/Src/Asp.NetCore2/SqlSugar/Entities/EntityColumnInfo.cs index 790e04165..80ef3a714 100644 --- a/Src/Asp.NetCore2/SqlSugar/Entities/EntityColumnInfo.cs +++ b/Src/Asp.NetCore2/SqlSugar/Entities/EntityColumnInfo.cs @@ -19,6 +19,7 @@ namespace SqlSugar public bool IsNullable { get; set; } public bool IsIdentity { get; set; } public bool IsPrimarykey { get; set; } + public bool IsTreeKey { get; set; } public bool IsEnableUpdateVersionValidation { get; set; } public string EntityName { get; set; } public string DbTableName { get; set; } diff --git a/Src/Asp.NetCore2/SqlSugar/Entities/Mapping/SugarMappingAttribute.cs b/Src/Asp.NetCore2/SqlSugar/Entities/Mapping/SugarMappingAttribute.cs index 03156a9e7..ce2e87111 100644 --- a/Src/Asp.NetCore2/SqlSugar/Entities/Mapping/SugarMappingAttribute.cs +++ b/Src/Asp.NetCore2/SqlSugar/Entities/Mapping/SugarMappingAttribute.cs @@ -190,6 +190,12 @@ namespace SqlSugar set { _IsArray = value; } } + private bool _IsTreeKey; + public bool IsTreeKey + { + get { return _IsTreeKey; } + set { _IsTreeKey = value; } + } }