1. 程式人生 > >遞迴應用-遍歷資料庫表

遞迴應用-遍歷資料庫表

【需求】

       前臺資源和後臺資源都放在一張資源表中,但是我們需要只查詢所有前臺資源或者只查詢所有後臺資源?

【思維方式】

       每個資源都有自己的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>

【小結】

       以前學習遞迴或者二叉樹的時候,只是感覺很理論,通過這次學習,才知道原來知識是需要這樣運用的。