免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

CSharpThinking---查詢表達(dá)式與Linq to Objects(五)

 昵稱10504424 2013-06-08
本文不會(huì)按照“由淺入深”的思路來講解概念,相反從特性的本質(zhì)及關(guān)聯(lián)講起,最后簡單介紹一些“小技巧”和需要注意的地方,著實(shí)有頭重腳輕的感覺。--- 史蒂芬King

  

一,概念

  1.1 查詢表達(dá)式起源

     C#語言的設(shè)計(jì)者決定在C#3中提供一個(gè)新的語法:查詢表達(dá)式。

       以此彌補(bǔ)復(fù)雜語句中標(biāo)準(zhǔn)查詢運(yùn)算符的難以理解、復(fù)雜與提高與Sql語句的相似度來便于學(xué)習(xí)(查詢表達(dá)式與SQL最大的區(qū)別是from與Select的位置倒置,這是為IDE提供智能感知的”推斷“類型功能)。

     上面的例子是簡潔版查詢表達(dá)式的一個(gè)Demo,查詢表達(dá)式其實(shí)是對底層API的一系列方法的調(diào)用。CIL本身并不理解“查詢表達(dá)式”的概念。事實(shí)上,除了涉及表達(dá)式樹的地方能使用查詢表達(dá)式,但底層CLR根本沒有改動(dòng),相反,查詢表達(dá)式是通過

C#編譯器的改動(dòng)來支持這一特性的。

    以上代碼編譯之后通過,IL查看的部分編碼如下:

    通過對編譯后的DLL分析,得出兩個(gè)結(jié)論:

      1) 查詢表達(dá)式確實(shí)被編譯成了委托,也就是說是編譯器執(zhí)行了代碼,而非運(yùn)行時(shí)或CLR支持。

      2) 由于編譯時(shí)已經(jīng)生成了委托,所以大多數(shù)查詢表達(dá)式也是”延遲執(zhí)行“方式。

    注:

 

  1.2 查詢表達(dá)式的流處操作與緩沖操作

    1) 緩沖操作:將所有數(shù)據(jù)一次性加載進(jìn)內(nèi)存,然后運(yùn)算,最后輸出結(jié)果。如Enumerable.Revense。

    2) 流操作:一次處理每個(gè)序列的一個(gè)元素,提高效率。如下:

    3)join子句的內(nèi)聯(lián):左邊的子句是流處理方式,右邊的子句是緩沖方式,這種操作依然是延遲操作。(原則:效率至上,所以盡可能的右邊序列要小。

 

  1.3 查詢表達(dá)式與點(diǎn)標(biāo)記(Dot notation)之間做出的選擇

    點(diǎn)標(biāo)記:用普通的C#調(diào)用Linq查詢操作符來代替查詢表達(dá)式。(實(shí)際上編譯器轉(zhuǎn)化查詢表達(dá)式也是如此的過程)

    原則:更加的可讀性及習(xí)慣性。查詢表達(dá)式更像是函數(shù)式編程,結(jié)構(gòu)化思維;而點(diǎn)標(biāo)記適合查詢條件比較少時(shí)清晰易懂。

                 查詢表達(dá)式是”說明性“的,與之相對的是”命令性“的語言,說明性的語言關(guān)心的是操作步驟而絕非僅僅是結(jié)果。

   

二,查詢表達(dá)式操作符

  2.1 From 與 Select 

    2.1.1 語法: from element select source, 以from開頭,以select結(jié)尾,其中 element 只是一個(gè)標(biāo)示符,select子句被稱為投影。

     2.1.2 退化的查詢表達(dá)式

      當(dāng)select子句什么都不做時(shí)會(huì)發(fā)生什么?答:編譯器依然會(huì)生成select方法的調(diào)用。

        然而,這個(gè)表達(dá)式和簡單表達(dá)式Sample.Allusers還是有很大不同的,雖說他們返回的數(shù)據(jù)項(xiàng)時(shí)相同的,不同的是查詢表達(dá)式返回的是一個(gè)新的結(jié)果集,對結(jié)果集順序改變不會(huì)改變原數(shù)據(jù)集順序,但如果改變數(shù)據(jù)項(xiàng),則原數(shù)據(jù)也會(huì)改變。

 

    2.2 Where和OrderBy

    2.2.1 OrderBy:ascending升序,descending降序 或者 OrderByDescending。OrderBy如果要繼續(xù)查詢需跟隨ThenBy,如若存在多個(gè)OrderBy,則最后一個(gè)OrderBy“獲勝”。

    2.2.2 Where:

 

  2.3 let子句

    消除不必要的重復(fù)“調(diào)用”

 

  2.4 聯(lián)接join

    2.4.1 定義:他使用兩張數(shù)據(jù)表(視圖,表值函數(shù)等),通過匹配兩者之間的數(shù)據(jù)行來創(chuàng)建結(jié)果。

           左邊序列進(jìn)行“流處理“,右邊序列進(jìn)行緩沖處理。

    2.4.2 join子句的內(nèi)連接

    2.4.3 使用join...into 子句進(jìn)行分組聯(lián)接

  

  2.5 分組和查詢延續(xù)

    2.5.1 語法: group 投影 by 分組

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多