Update ToTree

This commit is contained in:
sunkaixuan
2022-10-24 14:41:23 +08:00
parent 79a20b9fe8
commit ed6a3ea295
3 changed files with 47 additions and 5 deletions

View File

@@ -294,6 +294,11 @@ namespace SqlSugar
var list = this.ToList();
return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue);
}
public List<T> ToTree(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue, object[] childIds)
{
var list = this.ToList();
return TreeAndFilterIds(childListExpression, parentIdExpression, rootValue, childIds, ref list);
}
public virtual DataTable ToDataTable()
{

View File

@@ -492,7 +492,11 @@ ParameterT parameter)
var result = list.ToDictionary(it => it.Key.ObjToString(), it => it.Value);
return result;
}
public async Task<List<T>> ToTreeAsync(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue, object[] childIds)
{
var list = await this.ToListAsync();
return TreeAndFilterIds(childListExpression, parentIdExpression, rootValue, childIds, ref list);
}
public async Task<List<T>> ToTreeAsync(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue)
{
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();

View File

@@ -10,7 +10,7 @@ using System.Reflection;
using System.Dynamic;
using System.Threading.Tasks;
namespace SqlSugar
namespace SqlSugar
{
public partial class QueryableProvider<T> : QueryableAccessory, ISugarQueryable<T>
{
@@ -182,18 +182,51 @@ namespace SqlSugar
return result;
}
private List<object> GetPrentIds(List<T> list, object id, EntityColumnInfo pkName, EntityColumnInfo parentName)
{
var currentId = id;
List<object> result = new List<object>();
result.Add(id);
while (list.Any(it => pkName.PropertyInfo.GetValue(it).Equals(currentId)))
{
var data = list.First(it => pkName.PropertyInfo.GetValue(it).Equals(currentId));
currentId = parentName.PropertyInfo.GetValue(data);
result.Add(currentId);
}
return result;
}
private List<T> TreeAndFilterIds(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue, object[] childIds, ref List<T> list)
{
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
var pk = GetTreeKey(entity);
var pkColumn = entity.Columns.FirstOrDefault(z => z.PropertyName == pk);
var newIds = new List<object>();
string parentIdName = GetParentName(parentIdExpression);
var parentColumn = entity.Columns.FirstOrDefault(z => z.PropertyName == parentIdName);
foreach (var id in childIds)
{
newIds.AddRange(GetPrentIds(list, id, pkColumn, parentColumn));
}
list = list.Where(z => newIds.Any(it => it.Equals(pkColumn.PropertyInfo.GetValue(z)))).ToList();
return GetTreeRoot(childListExpression, parentIdExpression, pk, list, rootValue);
}
private List<T> GetTreeRoot(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, string pk, List<T> list, object rootValue)
{
var childName = ((childListExpression as LambdaExpression).Body as MemberExpression).Member.Name;
string parentIdName = GetParentName(parentIdExpression);
return BuildTree(list, pk, parentIdName, childName, rootValue)?.ToList() ?? default;
}
private static string GetParentName(Expression<Func<T, object>> parentIdExpression)
{
var exp = (parentIdExpression as LambdaExpression).Body;
if (exp is UnaryExpression)
{
exp = (exp as UnaryExpression).Operand;
}
var parentIdName = (exp as MemberExpression).Member.Name;
return BuildTree(list, pk, parentIdName, childName, rootValue)?.ToList() ?? default;
return parentIdName;
}
private static IEnumerable<T> BuildTree(IEnumerable<T> list, string idName, string pIdName, string childName, object rootValue)
@@ -1308,7 +1341,7 @@ namespace SqlSugar
string sql = QueryBuilder.ToSqlString();
RestoreMapping();
return new KeyValuePair<string, List<SugarParameter>>(sql, QueryBuilder.Parameters);
}
}
#endregion
}
}