递归应用-遍历数据库表

【需求】

       前台资源和后台资源都放在一张资源表中,但是我们需要只查询所有前台资源或者只查询所有后台资源?

【思维方式】

       每个资源都有自己的ID,由于资源过多,所以资源用树形结构来管理,即平台--系统--模块--页面,相应的我们设计数据库时就会给每个资源加上一个PID,我们可以通过每个资源的ID查询它的下属节点,也可以通过他们的PID查询他们的上司资源,最后返回一个泛型集合即可。

      但是通过ID查询它的所有下属资源就不是一个简单的查询方法那么简单了。后台资源比较少,只有一层,我们只需要查询PID为传入的ID即可,也可以说我们需要查询谁的PID为ID,那么谁就是ID的下属资源。但是,第一,这种方法不灵活,只要后台资源再加一层,查询结果就会有误;第二,即便后台可以这样查,那前台的查询还未解决。所以Pass掉重新想吧。

       沿用上面的想法,我已知前台(也就是云平台)自己的ID,根据该ID可以查询到它的第一层子资源,如果根据所查询的参数,再循环查询第一层子资源的子资源......(我查了一下,前后台最多有四层资源),也就是我只要写四层嵌套循环即可。哈哈,但是,同样不灵活,就像一层窗户纸,但凡一点风就会刮破。那就再想吧。

       根据第二个想法,从已知的一个ID,查询出一个ID集合,再根据ID集合查询出另一些ID集合,根据父子关系,不断循环,并且把将每次的查询出的结果集合,累加给一个returnlist,最后返回returnlist,这样的思想和模式跟二叉树遍历或者递归思想非常像,貌似有了一个突破口,那就行动吧。

       重新瞅了瞅递归的思想,的确如我所想,最终,终于写出了第一个版本的方法,但是经过测试返回数据为所有资源。再改,结果为0条数据。

       在盖盖的帮忙下发现,原来是因为最后需要返回的泛型集合也就是returnlist,在每次的递归调用中都被清零 了所以最后返回的数据为空,那就定义一个静态全局变量吧,果然如此,这次成功的加载了正确的资源。

       但是,调用测试发现,没调用一次该接口费方法,都会将数据累加一倍?思来想去,肯定是静态变量没有清空,所以每次调用一次都会多加一倍数据,经过几次修改,才发现,为什么要定义一个静态的呢?只要是个全局变量用于累加返回的结果集合不就行啦?这么一试,bingo。下面就来展示一下代码吧

【代码实现】

<span style="font-size:24px;">  #region FindallChildren-运用递归查询前台或者后台资源-郑艳霞-2016年1月28日18:05:24
        //声明一个静态全局变量
        public  List<BackResourceViewModel> viewBackList = new List<BackResourceViewModel>();

        /// <summary>
        /// FindallChildren-运用递归查询前台或者后台资源-郑艳霞-2016年1月28日18:05:24
        /// </summary>
        /// <param name="resourcepid"></param>
        /// <returns></returns>
        public  List<BackResourceViewModel> FindallChildren(Guid resourcepid)
        {
            List<BackResourceViewModel> resourceList = this.CurrentDal.LoadItems(n => n.ResourcePId == resourcepid).Select(n => new BackResourceViewModel()
            {
                ResourcePId = (Guid)n.ResourcePId,
                ResourceId = n.ResourceId,
                ResourceName = n.ResourceName,
                Type = n.Type,
                Priority = (short)n.Priority,
                Desc = n.Desc
            }).ToList();

            viewBackList.AddRange(resourceList);

            foreach (var item in resourceList)      
           {
               List<BackResourceViewModel> tmpChildren = FindallChildren(item.ResourceId);
            }

            return viewBackList;
        }
        #endregion</span>

【小结】

       以前学习递归或者二叉树的时候,只是感觉很理论,通过这次学习,才知道原来知识是需要这样运用的。

评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值