C 學習筆記(八) LINQ查詢之子查詢

2021-08-01 21:06:54 字數 2113 閱讀 3632

在linq中,所謂的子查詢就是包含在另乙個查詢的lambda表示式中的查詢語句。下面這個示例中就是使用子查詢對一組**家名字按姓氏排序:

string musos =

;ienumerablequery = musos.orderby (m => m.split().last());

string names = ;

ienumerableouterquery = names

.where (n => n.length == names.orderby (n2 => n2.length)

.select (n2 => n2.length).first());

tom, jay

使用查詢表示式語法可以實現同樣的功能:

ienumerable outerquery =

from n in names

where n.length ==

(from n2 in names orderby n2.length select n2.length).first()

select n;

在上面的表示式中,範圍變數n已經作為父查詢的變數使用,所以在子查詢左手凝固就不能在使用n作為範圍變數了,這裡使用了n2.

子查詢在什麼時候執行完全是由外部查詢決定的,當外部查詢就開始執行時,子查詢也同時執行,他們是同步的,在整個查詢中,子查詢的執行結果被作為父查詢的某個組成部分,我們可以認為查詢的開始命令是從外向內傳遞的,對本地集合的查詢嚴格按照這種由外向內的順序進行;但對於資料庫的查詢,則沒那麼嚴格,只是原則是按照這種方式進行。

另一種理解方式是,子查詢會在需要返回查詢結果時執行,那什麼時候需要子查詢返回查詢結果決定了外部查詢什麼時候被執行,在上面的例子中,子查詢(那個傳動帶)會在每次外部迴圈中都執行,也就是這裡的子查詢是由外部迴圈觸發的。結合下面這兩張圖,我們可以把之前用到的子查詢簡潔的定義為:

ienumerablequery =

from n in names

where n.length == names.orderby (n2 => n2.length).first().length

select n;

如果在上面這段**中使用min函式後,將會更進一步簡潔化:

在下面的章節中,會介紹如何使用linq查詢遠端資料來源,如對sql資料表的查詢,上面的**段是乙個非常標準的查詢語句,使用乙個linq語句就完成了所有的操作,黨對資料庫進行查詢時,只需訪問一次資料庫就可以全部完成。但對於本地資料來源來說,上面這個查詢語句在執行時效率比較低,因為字串長度會被重複計算多次,我們可以單獨執行子查詢來避免這種重複的操作(單獨執行的子查詢實際上不是乙個子查詢,而是乙個全新的查詢語句)**如下:

int shortest = names.min (n => n.length);

ienumerable query = from n in names

where n.length == shortest

select n;

子查詢中使用單個元素或者聚合函式(count、first)的時候,整個linq查詢語句並不會被強制執行,外部查詢還是以延遲載入的方式執行。這是因為子查詢是被間接執行的,在本地集合查詢中,它通過委託的驅動來執行;而在遠端資料來源的查詢中,它通過表示式樹的方式執行。

如果select語句總包含了子查詢,這這種情況下如果是本地查詢,那麼相當於將原序列重新封裝到乙個新的蓄力中,集合中的每個元素都是以延遲載入的方式執行的。關於這方面的介紹,將在後面做詳細的介紹。

MYSQL學習筆記(八)之子查詢的優化 使用連線

當在其他表進行子查詢時,mysql會將結果儲存在一張臨時表中,查詢結束後會釋放建立的臨時表,這就將使查詢的速度變慢。在多表查詢時一般不使用子查詢,而使用連線。連線分為內連線,外連線,外連線又分為左外連線和右外連線。例項 觀察表tdb goods會發現,欄位goods cate和brand name中...

C 學習筆記(八) LINQ查詢的基礎知識(下)

這兩個表示式語法各有優勢。在包含以下運算子的查詢操作中,使用查詢表示式更方便 在查詢中使用let子句匯入新的查詢變數。在查詢中用到selectmany join或者groupjoin這些運算子。對於只包含where orderby或者select的查詢語句,這兩種查詢方式都可以。一般來說,查詢表示式...

C 學習 LINQ 查詢

在c 中使用linq查詢需要引入命名空間using system.linq 案例實操 資料準備 var roles newlist gamerole newgamerole newgamerole newgamerole newgamerole newgamerole newgamerole var...