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

浙公网安备 33010602011771号