麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

C# 使用Linq遞歸查詢數據庫遇到的問題及解決方法

2019-11-17 03:26:37
字體:
來源:轉載
供稿:網友


User表通常是我們在寫“XX管理系統”項目時必須要用到的,有的情況下人員的分類屬于樹形結構,就是除了最高層和最低層,中間層都有相對的父和子,設計數據庫的時候,我們通常會加一個parent_id這樣的字段。這樣我們就可以通過當前用戶的user_id查詢出他的直接下屬有哪些,或者通過parent_id查詢出他的直接上司是誰。

但是當我們想通過user_id去查詢出其所有下屬的時候,就不是能用一條簡單的sql能實現的了。如果項目要是.Net Framework3.5以下的,就是沒有Linq的時候,通常會在數據庫里寫一個函數,然后在寫sql的時候直接調用函數就能得到一個篩選出來的結果集。如果是Linq呢?我想應該就是要寫一個靜態方法了,正好自己遇到了一個這樣的問題,也是剛接觸Linq,所以試著寫了一下。

不過無論是在數據庫中寫函數還是在項目中寫一個靜態方法,我想都是要用到遞歸去實現的。

我的思路就是傳入當前的user_id然后返回它的所有下屬的結果集。最后在這個結果集上去根據條件查詢。但是,在寫這個方法的過程中還是遇到了幾個問題:

1、如何將查詢出來的結果集var類型,轉換成List<T>類型

最開始我是這樣去寫的
/*大錯特錯*/
var list = from ....... where.... select...;
.....
return list.ToList<T>();
 
現在看看我還是挺有創造力的哈,居然能寫出這么個東西。

首先不說list.ToList<T>();本身就畫紅線,為什么我要在最后 return 的時候才去ToList()呢?原因是我知道var 可以用“+=”運算符。這樣遞歸的時候將深一層的返回值直接+到一起,用起來方便一些。

啊~真是大錯特錯了,首先,按照我的思路,深一層返回的值已經是ToList類型了,所以不能再用+=運算符了.其次,好吧,我承認,我還是沒有太了解var是個什么東西。其實在程序運行之后,list就會有一個明確的類型,是系統去自動判定出來的。var只是使我們編程的時候更方便一些,有點像程序蜜糖(忘記是從哪聽來的了),也就是說系統應該能識別出list是一個T類型對象的集合,而我這么寫就有點畫蛇添足的意味了。

正解:
var list = (from ....... where.... select...).ToList();
.....
return list;

這樣,list 就會變成我想要的List<T>類型了,因為函數的返回值就是這個類型,所以正是我想要的。

2、提示報錯:Collection was modified; enumeration Operation may not execute.

這個錯誤的原因是因為用foreach遍歷的時候,對Collection(這里的temp)這個數據集進行了Add/Remove操作。這樣就有可能在未遍歷到最后的時候,就把這個Collection給修改了,隨之就報錯了。解決辦法有說用for代替foreach的,但是我還是覺得foreach要好些,所以創建了一個Collection這個結果集副本,然后一個用作遍歷,一個用作Add/Remove操作,當然,返回的是用后者。

注意創建副本的時候一定新new一個對象,而不是直接聲明之后賦值,否則跟沒寫一樣。
List<T> tmpList = list; //錯誤

List<T> tmpList = new List<T>(list);//正確
 
最后完整的代碼為:
        contextdata ctdt = new contextdata();
        public static List<db_userinfo> findallchildren(int parentid)
        {
            var list = (from c in ctdt.db_userinfo
                        where c.parent_id == parentid
                        select c).ToList();
            List<db_userinfo> tmpList = new List<db_userinfo>(list);
            foreach (db_userinfo single in temp)
            {
                List<db_userinfo> tmpChildren = findallchildren(single.user_id);
                if (tmpChildren.Count != 0)
                {
                    list.AddRange(tmpChildren);
                }
            }
            return list;
        }
 
這樣,在頁面的后臺代碼.cs文件中,就可以直接把這個方法的返回值作為條件查詢中基礎數據集。如
var result = from c in findallchildren(userid)  where.....select....;
 
應該還有更好的方法,希望比較懂的朋友能多傳授一下,歡迎蓋樓!~

1、Live your own, then enough. 2、Enjoy life, enjoy work. 新浪微博:http://weibo.com/zhouhongyu1989 歡迎圍觀~! 友情鏈接:http://zhouhongyu1989.blog.51cto.com/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 在线观看国产一区二区 | 精品在线一区二区三区 | 色天天综合网 | 日本欧美中文字幕 | 一级做a爱片毛片免费 | 国产精品久久久久久久久久尿 | 羞羞视频免费网站含羞草 | 精国品产一区二区三区有限公司 | 成年人在线视频 | 亚洲综人网 | 久久青草热 | 狠狠操天天射 | 欧美日韩国产一区二区三区在线观看 | 黄色av片三级三级三级免费看 | 欧美一级淫片免费播放口 | 爽成人777777婷婷 | av电影免费在线 | 国产成年人网站 | 黄色片网页| 亚洲精品动漫在线观看 | 中文字幕在线免费观看电影 | www.成人免费视频 | 视频一区 中文字幕 | 91美女福利视频 | 最新av在线播放 | 成人免费毛片片v | 欧日韩| 91成人一区二区三区 | japanese javhd| 91香蕉国产亚洲一区二区三区 | 国产精品av久久久久久久久久 | 午夜视频在线观看免费视频 | 成人午夜在线观看视频 | 毛片电影网址 | 男女羞羞视频在线免费观看 | 狠狠干五月天 | 免费观看黄色一级视频 | 亚洲男人的天堂在线视频 | 日本免费一区二区三区四区 | 国产资源在线观看 | 深夜影院一级毛片 |