基于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;
        }