【.NET/.NET CORE】使用LINQ实现树形结构数据递归查询

 以查询行政区划为例:

类/方法定义:

/// <summary>
/// 通过传入地区行政区划代码获取该地区父级行政区划名称字符串
/// </summary>
/// <param name="AreaCode">查询地区代码</param>
/// <returns>输入东城区行政区划代码,返回字符串示例:北京-北京市-东城区</returns>
public string GetParentAddress(string AreaCode) {
    string address = "";
    List<AreaEntity> list = /*自行定义获取地区集合方法*/;
    AreaEntity area = list.Find(a => a.AreaCode.Equals(AreaCode));
    if (area != null) address = GetParentResult(list, area.AreaCode, area.ParentAreaCode);
    return address;
}

/// <summary>
/// 通过传入地区行政区划代码获取该地区子集行政区划名称字符串
/// </summary>
/// <param name="AreaCode">查询地区代码</param>
/// <returns>输入北京行政区划代码,返回字符串示例:北京-北京市-东城区等所有所属北京子集行政区划集合字符串</returns>
public string GetChildAddress(string AreaCode) {
    string address = "";
    List<AreaEntity> list = /*自行定义获取地区集合方法*/;
    address = GetChildResult(list, area.AreaCode);
    return address;
}

/// <summary>
/// 通过传入的地区集合和当前地区父级地区代码递归查询改地区父级数据集合
/// </summary>
/// <param name="list">区域List</param>
/// <param name="ParentAreaCode">查询地区父级地区代码</param>
/// <returns></returns>
public List<AreaEntity> GetParentRegion(List<AreaEntity> list, string ParentAreaCode) {
    List<AreaEntity> query = (from region in list
                                where region.AreaCode == ParentAreaCode
                                select region).ToList();
    return query.ToList().Concat(query.ToList().SelectMany(r => GetParentRegion(list, r.ParentAreaCode))).ToList() ;
}

/// <summary>
/// 查询所属地集合结果字符串
/// </summary>
/// <param name="list">地区集合</param>
/// <param name="AreaCode">查询地区代码</param>
/// <param name="ParentAreaCode">查询地区父级地区代码</param>
/// <returns>XXX-XXX-XXX</returns>

public string GetParentResult(List<AreaEntity> list, string AreaCode,string ParentAreaCode)
{
    string resultStr = "";
    List<AreaEntity> regions = new List<AreaEntity>();
    regions.AddRange(list.Where(r => r.AreaCode == AreaCode));
    regions.AddRange(GetParentRegion(list, ParentAreaCode));
    regions = regions.Count > 1 ? regions.OrderBy(a => Convert.ToInt32(a.AreaCode)).ToList() : regions;
    if (regions.Count > 0) {
    regions.ForEach(a => {
        resultStr += (!string.IsNullOrEmpty(resultStr) ? "-" : "") + a.AreaName ;
    });
    }
    return resultStr;
}

/// <summary>
/// 通过传入的地区集合和当前地区代码递归查询该地区子集级数据集合
/// </summary>
/// <param name="list">区域List</param>
/// <param name="AreaCode">查询地区代码</param>
/// <returns></returns>
public List<AreaEntity> GetChildRegion(List<AreaEntity> list, string AreaCode) {
    List<AreaEntity> query = (from region in list
                                where region.ParentAreaCode== AreaCode
                                select region).ToList();
    return query.ToList().Concat(query.ToList().SelectMany(r => GetChildRegion(list, r.AreaCode))).ToList() ;
}

/// <summary>
/// 查询所属地集合结果字符串
/// </summary>
/// <param name="list">地区集合</param>
/// <param name="AreaCode">查询地区代码</param>
/// <returns>XXX-XXX-XXX</returns>
public string GetChildResult(List<AreaEntity> list, string AreaCode)
{
    string resultStr = "";
    List<AreaEntity> regions = new List<AreaEntity>();
    regions.AddRange(list.Where(r => r.AreaCode == AreaCode));
    regions.AddRange(GetChildRegion(list, AreaCode));
    regions = regions.Count > 1 ? regions.OrderBy(a => Convert.ToInt32(a.AreaCode)).ToList() : regions;
    if (regions.Count > 0) {
        regions.ForEach(a => {
            resultStr += (!string.IsNullOrEmpty(resultStr) ? "-" : "") + a.AreaName ;
        });
    }
    return resultStr;
}


/// <summary>
/// 区域类
/// </summary>
public class AreaEntity 
    {
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public string AreaCode { get; set; }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public string ParentAreaCode { get; set; }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public string AreaName { get; set; }
    }

调用

void test(){
    List<AreaEntity> list = new List<AreaEntity>();
    list.Add(new AreaEntity() { AreaCode = "1", ParentAreaCode= "0", Name = "中国" });
    list.Add(new AreaEntity() { AreaCode = "2", ParentAreaCode= "1", Name = "北京" });
    list.Add(new AreaEntity() { AreaCode = "3", ParentAreaCode= "2", Name = "北京市" });
    list.Add(new AreaEntity() { AreaCode = "4", ParentAreaCode= "3", Name = "东城区" });
    list.Add(new AreaEntity() { AreaCode = "5", ParentAreaCode= "3", Name = "西城区" });
    list.Add(new AreaEntity() { AreaCode = "6", ParentAreaCode= "1", Name = "浙江" });
    list.Add(new AreaEntity() { AreaCode = "7", ParentAreaCode= "6", Name = "杭州" });
    list.Add(new AreaEntity() { AreaCode = "8", ParentAreaCode= "6", Name = "宁波" });
    //通过子节点查询根节点
    string resultParent = GetParentAddress("4");//结果:中国-北京-北京市-东城区
    //通过根节点查询子节点
    string resultChild = GetChildAddress("2");//结果:北京-北京市-东城区-西城区
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值