国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

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

2019-11-17 03:05:50
字體:
供稿:網(wǎng)友

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

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

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

不過無論是在數(shù)據(jù)庫中寫函數(shù)還是在項目中寫一個靜態(tài)方法,我想都是要用到遞歸去實現(xiàn)的。

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

1、如何將查詢出來的結(jié)果集var類型,轉(zhuǎn)換成List<T>類型

最開始我是這樣去寫的

/*大錯特錯*/var list = from ....... where.... select...;.....return list.ToList<T>();

現(xiàn)在看看我還是挺有創(chuàng)造力的哈,居然能寫出這么個東西。

首先不說list.ToList<T>();本身就畫紅線,為什么我要在最后 return 的時候才去ToList()呢?原因是我知道var 可以用“+=”運算符。這樣遞歸的時候?qū)⑸钜粚拥姆祷刂抵苯?到一起,用起來方便一些。

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

正解:

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

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

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

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

注意創(chuàng)建副本的時候一定新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文件中,就可以直接把這個方法的返回值作為條件查詢中基礎(chǔ)數(shù)據(jù)集。如

var result = from c in findallchildren(userid)  where.....select....;

應(yīng)該還有更好的方法,希望比較懂的朋友能多傳授一下,歡迎蓋樓!~


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沾化县| 桐梓县| 蒙山县| 广昌县| 玉溪市| 富宁县| 子长县| 台湾省| 寿光市| 和田县| 和顺县| 肥城市| 临桂县| 白玉县| 虞城县| 章丘市| 全椒县| 杨浦区| 塘沽区| 东乡| 杭州市| 蒲江县| 家居| 崇义县| 鹤庆县| 沿河| 靖江市| 登封市| 大冶市| 衡东县| 巴东县| 三门峡市| 巩义市| 新巴尔虎左旗| 资中县| 宁陵县| 邵阳县| 昂仁县| 皮山县| 临泉县| 东辽县|