基于sqlsuger的递归查询仓储
由于sqlsugar源码中只支持主键的递归,所以改写了下sqlsuger递归写法
////// 递归查询树形结构 /// /// 子表结构 /// 父级别标识 /// 条件 /// 上一级别标识值 /// 标识 ///public async Task > ToTreeAsync(Expression
>> childListExpression, Expression > parentIdExpression, Expression > whereExpression,object rootValue, string pk) { var list = await _db.Queryable ().WhereIF(whereExpression != null, whereExpression).ToListAsync(); var childName = ((childListExpression as LambdaExpression).Body as MemberExpression).Member.Name; var exp = (parentIdExpression as LambdaExpression).Body; if (exp is UnaryExpression) { exp = (exp as UnaryExpression).Operand; } var parentIdName = (exp as MemberExpression).Member.Name; var result = list.Where(it => { var value = it.GetType().GetProperty(parentIdName).GetValue(it); if (rootValue != null) { return value.ObjToString() == rootValue.ObjToString(); } else if (value == null || value.ObjToString() == "" || value.ObjToString() == "0" || value.ObjToString() == Guid.Empty.ToString()) { return true; } else { return false; } }).ToList(); if (result != null && result.Count > 0) { foreach (var item in result) { var pkValue = item.GetType().GetProperty(pk).GetValue(item); item.GetType().GetProperty(childName).SetValue(item, GetTreeChildList(list, pkValue, pk, childName, parentIdName)); } } return result; } public List GetTreeChildList(List alllist, object pkValue, string pkName, string childName, string parentIdName) { var result = alllist.Where(it => { var value = it.GetType().GetProperty(parentIdName).GetValue(it); return value.ObjToString() == pkValue.ObjToString(); }).ToList(); if (result != null && result.Count > 0) { foreach (var item in result) { var itemPkValue = item.GetType().GetProperty(pkName).GetValue(item); item.GetType().GetProperty(childName).SetValue(item, GetTreeChildList(alllist, itemPkValue, pkName, childName, parentIdName)); } } return result; }