mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-10-15 18:55:07 +08:00
Update ToTree
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
@@ -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>();
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user