Merge pull request #1084 from chuck2leo/optimize-tochildlist-includeself

Optimize tochildlist includeself
This commit is contained in:
果糖网
2022-10-13 00:06:32 +08:00
committed by GitHub
2 changed files with 36 additions and 82 deletions

View File

@@ -1358,53 +1358,19 @@ namespace SqlSugar
var list= this.ToPivotList(columnSelector, rowSelector, dataSelector); var list= this.ToPivotList(columnSelector, rowSelector, dataSelector);
return this.Context.Utilities.SerializeObject(list); return this.Context.Utilities.SerializeObject(list);
} }
public List<T> ToChildList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue,bool isContainOneself = true) public List<T> ToChildList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue, bool isContainOneself = true)
{ {
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>(); var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
var pk = GetTreeKey(entity); var pk = GetTreeKey(entity);
var list = this.ToList(); var list = this.ToList();
if (isContainOneself) return GetChildList(parentIdExpression, pk, list, primaryKeyValue, isContainOneself);
{
var result= GetChildList(parentIdExpression, pk, list, primaryKeyValue);
var pkDb = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(z=>z.PropertyName==pk);
if (pkDb != null)
{
var addItem = list.Where(z => pkDb.PropertyInfo.GetValue(z, null).Equals(primaryKeyValue)).FirstOrDefault();
if (addItem != null)
{
result.Add(addItem);
} }
} public async Task<List<T>> ToChildListAsync(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue, bool isContainOneself=true)
return result;
}
else
{
return GetChildList(parentIdExpression, pk, list, primaryKeyValue);
}
}
public async Task<List<T>> ToChildListAsync(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue,bool isContainOneself=true)
{ {
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>(); var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
var pk = GetTreeKey(entity); var pk = GetTreeKey(entity);
var list = await this.ToListAsync(); var list = await this.ToListAsync();
if (isContainOneself) return GetChildList(parentIdExpression, pk, list, primaryKeyValue, isContainOneself);
{
var result = GetChildList(parentIdExpression, pk, list, primaryKeyValue);
var pkDb = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(z => z.PropertyName == pk);
if (pkDb != null)
{
var addItem = list.Where(z => pkDb.PropertyInfo.GetValue(z, null).Equals(primaryKeyValue)).FirstOrDefault();
if (addItem != null)
{
result.Add(addItem);
}
}
return result;
}
else
{
return GetChildList(parentIdExpression, pk, list, primaryKeyValue);
}
} }
public List<T> ToParentList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue) public List<T> ToParentList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue)
{ {
@@ -2471,7 +2437,7 @@ namespace SqlSugar
RestoreMapping(); RestoreMapping();
return new KeyValuePair<string, List<SugarParameter>>(sql, QueryBuilder.Parameters); return new KeyValuePair<string, List<SugarParameter>>(sql, QueryBuilder.Parameters);
} }
private List<T> GetChildList(Expression<Func<T, object>> parentIdExpression, string pkName, List<T> list, object rootValue,bool isRoot=true) private List<T> GetChildList(Expression<Func<T, object>> parentIdExpression, string pkName, List<T> list, object rootValue, bool isContainOneself)
{ {
var exp = (parentIdExpression as LambdaExpression).Body; var exp = (parentIdExpression as LambdaExpression).Body;
if (exp is UnaryExpression) if (exp is UnaryExpression)
@@ -2479,11 +2445,11 @@ namespace SqlSugar
exp = (exp as UnaryExpression).Operand; exp = (exp as UnaryExpression).Operand;
} }
var parentIdName = (exp as MemberExpression).Member.Name; var parentIdName = (exp as MemberExpression).Member.Name;
var result = BuildChildList(list, pkName, parentIdName, rootValue); var result = BuildChildList(list, pkName, parentIdName, rootValue, isContainOneself);
return result; return result;
} }
private static List<T> BuildChildList(List<T> list, string idName, string pIdName, object rootValue) private static List<T> BuildChildList(List<T> list, string idName, string pIdName, object rootValue, bool isContainOneself)
{ {
var type = typeof(T); var type = typeof(T);
var idProp = type.GetProperty(idName); var idProp = type.GetProperty(idName);
@@ -2507,7 +2473,18 @@ namespace SqlSugar
return finalList; return finalList;
}; };
return fc(rootValue.ObjToString()); var result = fc(rootValue.ObjToString());
if (isContainOneself)
{
var root = kvpList.FirstOrDefault(x => x.Value == rootValue.ObjToString()).Key;
if (root != null)
{
result.Insert(0, root);
}
}
return result;
} }
private List<T> GetTreeRoot(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, string pk, List<T> list,object rootValue) private List<T> GetTreeRoot(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, string pk, List<T> list,object rootValue)

View File

@@ -1363,48 +1363,14 @@ namespace SqlSugar
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>(); var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
var pk = GetTreeKey(entity); var pk = GetTreeKey(entity);
var list = this.ToList(); var list = this.ToList();
if (isContainOneself) return GetChildList(parentIdExpression, pk, list, primaryKeyValue, isContainOneself);
{
var result= GetChildList(parentIdExpression, pk, list, primaryKeyValue);
var pkDb = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(z=>z.PropertyName==pk);
if (pkDb != null)
{
var addItem = list.Where(z => pkDb.PropertyInfo.GetValue(z, null).Equals(primaryKeyValue)).FirstOrDefault();
if (addItem != null)
{
result.Add(addItem);
}
}
return result;
}
else
{
return GetChildList(parentIdExpression, pk, list, primaryKeyValue);
}
} }
public async Task<List<T>> ToChildListAsync(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue,bool isContainOneself=true) public async Task<List<T>> ToChildListAsync(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue,bool isContainOneself=true)
{ {
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>(); var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
var pk = GetTreeKey(entity); var pk = GetTreeKey(entity);
var list = await this.ToListAsync(); var list = await this.ToListAsync();
if (isContainOneself) return GetChildList(parentIdExpression, pk, list, primaryKeyValue, isContainOneself);
{
var result = GetChildList(parentIdExpression, pk, list, primaryKeyValue);
var pkDb = this.Context.EntityMaintenance.GetEntityInfo<T>().Columns.FirstOrDefault(z => z.PropertyName == pk);
if (pkDb != null)
{
var addItem = list.Where(z => pkDb.PropertyInfo.GetValue(z, null).Equals(primaryKeyValue)).FirstOrDefault();
if (addItem != null)
{
result.Add(addItem);
}
}
return result;
}
else
{
return GetChildList(parentIdExpression, pk, list, primaryKeyValue);
}
} }
public List<T> ToParentList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue) public List<T> ToParentList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue)
{ {
@@ -2471,7 +2437,7 @@ namespace SqlSugar
RestoreMapping(); RestoreMapping();
return new KeyValuePair<string, List<SugarParameter>>(sql, QueryBuilder.Parameters); return new KeyValuePair<string, List<SugarParameter>>(sql, QueryBuilder.Parameters);
} }
private List<T> GetChildList(Expression<Func<T, object>> parentIdExpression, string pkName, List<T> list, object rootValue,bool isRoot=true) private List<T> GetChildList(Expression<Func<T, object>> parentIdExpression, string pkName, List<T> list, object rootValue, bool isContainOneself)
{ {
var exp = (parentIdExpression as LambdaExpression).Body; var exp = (parentIdExpression as LambdaExpression).Body;
if (exp is UnaryExpression) if (exp is UnaryExpression)
@@ -2479,11 +2445,11 @@ namespace SqlSugar
exp = (exp as UnaryExpression).Operand; exp = (exp as UnaryExpression).Operand;
} }
var parentIdName = (exp as MemberExpression).Member.Name; var parentIdName = (exp as MemberExpression).Member.Name;
var result = BuildChildList(list, pkName, parentIdName, rootValue); var result = BuildChildList(list, pkName, parentIdName, rootValue, isContainOneself);
return result; return result;
} }
private static List<T> BuildChildList(List<T> list, string idName, string pIdName, object rootValue) private static List<T> BuildChildList(List<T> list, string idName, string pIdName, object rootValue, bool isContainOneself)
{ {
var type = typeof(T); var type = typeof(T);
var idProp = type.GetProperty(idName); var idProp = type.GetProperty(idName);
@@ -2507,7 +2473,18 @@ namespace SqlSugar
return finalList; return finalList;
}; };
return fc(rootValue.ObjToString()); var result = fc(rootValue.ObjToString());
if (isContainOneself)
{
var root = kvpList.FirstOrDefault(x => x.Value == rootValue.ObjToString()).Key;
if (root != null)
{
result.Insert(0, root);
}
}
return result;
} }
private List<T> GetTreeRoot(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, string pk, List<T> list,object rootValue) private List<T> GetTreeRoot(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, string pk, List<T> list,object rootValue)