在使用abp vnext默认数据库生成的组织单元表时AbpOrganizationUnits会发现有个Code字段,如图
这个字段看完里面的数据,就知道是一个新版的父子递归查询的方法,曾经的递归是父id遍历子id进行互相查询,效率上很低下。
这个时候abp vnext使用了一个字段就可以实现父子级遍历的功能。
先写一个web api接口
/// <summary>
/// 通过Code加载所有组织
/// </summary>
/// <returns></returns>
public async Task<List<TreeChildViewDto>> GetByCodeAllAsync()
{
var dataList = await _organizationUnitRepository.GetListAsync();
var items = from p in dataList
select new TreeChildViewDto()
{
Id = p.Id,
ParentId = p.ParentId,
Code = p.Code,
DisplayName = p.DisplayName
};
return GetTree(items.ToList(), 0, "");
}
这个就是一个查询,查询数据库的字段,select 出自己想在前端展示的字段,可以自定义加。最终的结果是List的集合数据,这时回调GetTree()函数,函数如下:
/// <summary>
/// 使用Code进行递归
/// </summary>
/// <param name="items"></param>
/// <param name="deep"></param>
/// <param name="prefix"></param>
/// <returns></returns>
private List<TreeChildViewDto> GetTree(List<TreeChildViewDto> items, int deep, string prefix)
{
return (
from p in items
where p.Code.StartsWith(prefix) && p.Code.Count(a => a == '.') == deep
let subs = GetTree(items, deep + 1, p.Code)
select new TreeChildViewDto()
{
Id = p.Id,
ParentId = p.ParentId,
Code = p.Code,
DisplayName = p.DisplayName,
TreeChildren = subs.ToList()
}
).ToList();
}
返回的数据,就是父子级递归后的tree树集合了,其实也是递归,只不过是一个字段的递归。
此处用的类结构如下:
public class TreeChildViewDto
{
//组织Id
public Guid Id { get; set; }
//菜单名
public string DisplayName { get; set; }
//父节点Id
public Guid? ParentId { get; set; }
/// <summary>
/// 用来做递归的 新用法
/// </summary>
public string Code { get; set; }
public List<TreeChildViewDto> TreeChildren { get; set; }
}