基于sqlsuger的递归查询仓储

由于sqlsugar源码中只支持主键的递归,所以改写了下sqlsuger递归写法

        /// <summary>
        /// 递归查询树形结构
        /// </summary>
        /// <param name="childListExpression">子表结构</param>
        /// <param name="parentIdExpression">父级别标识</param>
        /// <param name="whereExpression">条件</param>
        /// <param name="rootValue">上一级别标识值</param>
        /// <param name="pk">标识</param>
        /// <returns></returns>
        public async Task<List<TEntity>> ToTreeAsync(Expression<Func<TEntity, IEnumerable<object>>> childListExpression, Expression<Func<TEntity, object>> parentIdExpression, Expression<Func<TEntity, bool>> whereExpression,object rootValue, string pk)
        {
            var list = await _db.Queryable<TEntity>().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<TEntity> GetTreeChildList(List<TEntity> 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;
        }

 

posted @ 2022-03-09 10:34  Ambition丿z  阅读(863)  评论(0)    收藏  举报