成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

LINQ之路:查詢表達(dá)式

開(kāi)發(fā) 后端
LINQ的語(yǔ)法本質(zhì)是通過(guò)擴(kuò)展的方法和Lambda表達(dá)式來(lái)創(chuàng)建查詢,今天我們將介紹的是查詢表達(dá)式(Query Expression)。

  書(shū)寫LINQ查詢時(shí)又兩種語(yǔ)法可供選擇:方法語(yǔ)法(Fluent Syntax)和查詢表達(dá)式(Query Expression)。

  LINQ方法語(yǔ)法的本質(zhì)是通過(guò)擴(kuò)展方法和Lambda表達(dá)式來(lái)創(chuàng)建查詢。C# 3.0對(duì)于LINQ表達(dá)式還引入了聲明式的查詢表達(dá)式,也叫查詢語(yǔ)法,通常來(lái)講,它是創(chuàng)建LINQ查詢的更加快捷的方式。盡管通過(guò)查詢語(yǔ)法寫出的查詢比較類似于SQL查詢,但實(shí)際上查詢表達(dá)式的產(chǎn)生并不是建立在SQL之上,而是建立在函數(shù)式編程語(yǔ)言如LISP和Haskell中的list comprehensions(列表解析)功能之上。本篇會(huì)對(duì)LINQ查詢語(yǔ)法進(jìn)行詳細(xì)的介紹。

  我們?cè)谇耙黄狶INAQ方法語(yǔ)法中所舉的示例:獲取所有包含字母”a”的姓名,按長(zhǎng)度排序并將結(jié)果轉(zhuǎn)為大寫。下面是與之等價(jià)的查詢表達(dá)式語(yǔ)法:

  1.   staticvoidMain(string[] args)  
  2.   {  
  3.   string[] names = { "Tom""Dick""Harry""Mary""Jay"};  
  4.   IEnumerable<string>query =  
  5.   from n innames  
  6.   wheren.Contains("a"//Filter elements  
  7.   orderby n //Sort elements  
  8.   select n.ToUpper(); //Translate each element  
  9.   foreach(stringname inquery)  
  10.   Console.WriteLine(name);  
  11.   } 

  查詢表達(dá)式總是以from子句開(kāi)始,以select或者group子句結(jié)束。From子句定義了查詢的范圍變量(range variable),可以認(rèn)為該變量是對(duì)輸入sequence的一個(gè)遍歷,就像foreach做的那樣。下面這幅圖描述了查詢表達(dá)式的完整語(yǔ)法:

  當(dāng)然,.NET公共語(yǔ)言運(yùn)行庫(kù)(CLR)并不具有查詢語(yǔ)法的概念。編譯器會(huì)在程序編譯時(shí)把查詢表達(dá)式轉(zhuǎn)換為方法語(yǔ)法,即對(duì)擴(kuò)展方法的調(diào)用。這意味著,我們用查詢表達(dá)式寫出來(lái)的LINQ查詢都有等價(jià)的方法語(yǔ)法。對(duì)于上例中的查詢表達(dá)式,編譯器會(huì)轉(zhuǎn)換成下面的方法語(yǔ)法:

 

  1.   IEnumerable<string>query = names  
  2.   .Where (n => n.Contains("a"))  
  3.   .OrderBy(n => n.Length)  
  4.   .Select (n => n.ToUpper()); 

 

  然后,應(yīng)用編譯器對(duì)于方法語(yǔ)法的處理規(guī)則,上面的Where, OrderBy, Select查詢運(yùn)算符會(huì)綁定到Enumerable類中的相應(yīng)擴(kuò)展方法。

  范圍變量

  范圍變量是緊隨from關(guān)鍵字之后定義的變量,一個(gè)范圍變量指向當(dāng)前操作符所對(duì)應(yīng)的輸入sequence中的當(dāng)前元素。在我們的示例中,范圍變量出現(xiàn)在每一個(gè)查詢子句中,但要注意的是,變量實(shí)際是對(duì)不同sequence的遍歷,因?yàn)閃here、OrderBy、Select會(huì)有不同的輸入sequence:

 

  1.   IEnumerable<string>query =  
  2.   from n innames //n是我們定義的范圍變量  
  3.   wheren.Contains("a"//n直接來(lái)自names array  
  4.   orderby n.Length //n來(lái)自filter之后的subsequent  
  5.   select n.ToUpper(); //n來(lái)自O(shè)rderBy之后的subsequent 

 

  當(dāng) 編譯器把上面的查詢語(yǔ)法翻譯成方法語(yǔ)法后,我們會(huì)更清楚的看到范圍變量的這種行為:

 

  1.   IEnumerable<string>query2 = names  
  2.   .Where(n => n.Contains("a")) //n直接來(lái)自names array  
  3.   .OrderBy(n => n.Length) //n來(lái)自filter之后的subsequent  
  4.   .Select(n => n.ToUpper()); //n來(lái)自O(shè)rderBy之后的subsequent  

 

  除了from關(guān)鍵字后面的范圍變量,查詢表達(dá)式還允許我們通過(guò)下面的子句引入新的范圍變量:

  let

  into

  額外的from子句

  稍后我們會(huì)在“LINQ中的子查詢、創(chuàng)建策略和數(shù)據(jù)轉(zhuǎn)換”一篇中討論他們的使用方法和適用場(chǎng)景。

  查詢表達(dá)式和方法語(yǔ)法

  查詢表達(dá)式和方法語(yǔ)法各有所長(zhǎng)。對(duì)下面的場(chǎng)景來(lái)講,用查詢表達(dá)式寫出來(lái)得查詢會(huì)更加簡(jiǎn)潔:

  使用let關(guān)鍵字引入新的范圍變量

  在SelectMany、Join或GroupJoin后引用外部范圍變量時(shí)

  在簡(jiǎn)單的使用Where、OrderyBy、Select時(shí),兩種語(yǔ)法結(jié)構(gòu)并沒(méi)有大的差別,此時(shí)可以根據(jù)你的喜好任意選擇。

  對(duì)于只有單個(gè)查詢運(yùn)算符組成的查詢,方法語(yǔ)法會(huì)更加簡(jiǎn)短和易于理解。

  ***,對(duì)于沒(méi)有對(duì)應(yīng)查詢表達(dá)式關(guān)鍵字的查詢運(yùn)算符,我們就只能選擇方法語(yǔ)法了。下面是存在對(duì)應(yīng)查詢表達(dá)式關(guān)鍵字的運(yùn)算符:Where、Select、SelectMany、OrderBy、ThenBy、OrderByDescending、ThenByDescending、GroupBy、Join、GroupJoin。

  組合查詢語(yǔ)法

  當(dāng)一個(gè)查詢運(yùn)算符沒(méi)有對(duì)應(yīng)的查詢語(yǔ)法時(shí),我們可以組合使用查詢語(yǔ)法和方法語(yǔ)法。唯一的約束是查詢中的每一個(gè)查詢語(yǔ)法部分必須是完整的,如以from開(kāi)始以select或group結(jié)束。如下例:

 

  1.   string[] names = { "Tom""Dick""Harry""Mary""Jay"};  
  2.   //計(jì)算包含字母”a”的姓名總數(shù)  
  3.   intmatches = (from n innames wheren.Contains("a") select n).Count(); //3//按字母順序排序的***個(gè)名字  
  4.   stringfirst = (from n innames orderby n select n).First(); //Dick 

 

  這種組合語(yǔ)法通常在書(shū)寫更加復(fù)雜的查詢時(shí)會(huì)具有優(yōu)勢(shì),像上面這種簡(jiǎn)單的查詢,我們只需要使用方法語(yǔ)法就能收到很好的效果:

  1.   intmatches = names.Where(n => n.Contains("a")).Count(); //3  
  2.   stringfirst = (names.OrderBy(n => n)).First(); //Dick 

原文鏈接:http://www.cnblogs.com/lifepoem/archive/2011/10/28/2227735.html

【編輯推薦】

  1. Linq to xml操作XML
  2. XML之父解讀未來(lái)互聯(lián)網(wǎng)"游戲化"的三個(gè)真諦
  3. Ajax和Web服務(wù)數(shù)據(jù)格式:XML SOAP HTML
  4. 超強(qiáng)解析XML——簡(jiǎn)單直接的來(lái)
  5. 解析PHP中的XML數(shù)據(jù)
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-09-10 15:35:07

LINQ查詢表達(dá)式

2009-09-17 11:08:55

LINQ查詢表達(dá)式

2009-09-07 17:18:33

LINQ查詢表達(dá)式

2009-09-11 09:53:16

Linq查詢表達(dá)式

2009-08-27 09:13:28

LINQ查詢表達(dá)式

2009-09-17 09:09:50

Lambda表達(dá)式Linq查詢

2009-09-09 17:45:07

Linq表達(dá)式

2009-09-11 09:48:27

Linq Lambda

2009-09-17 14:21:19

LINQ表達(dá)式

2009-09-09 13:01:33

LINQ Lambda

2009-09-11 12:32:33

LINQ表達(dá)式

2009-09-15 15:18:00

Linq Lambda

2009-06-12 09:44:04

LINQ查詢復(fù)合from子句

2009-09-17 09:15:49

Linq表達(dá)式樹(shù)

2009-09-15 17:30:00

Linq Lambda

2009-09-17 09:44:54

Linq Lambda

2009-09-17 10:40:22

Linq Lambda

2009-03-23 10:47:43

數(shù)據(jù)庫(kù)SQLLINQ

2009-09-17 14:24:35

LINQ表達(dá)式

2009-09-09 17:14:17

Linq lambda
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一级大片免费 | 欧美1区| 欧美成人免费在线 | 爱爱无遮挡| 色综合天天天天做夜夜夜夜做 | 国产精品网址 | 欧日韩在线观看 | 精品国产乱码久久久久久蜜退臀 | 青青久草 | 日韩免费激情视频 | 天堂一区二区三区四区 | 国产欧美日韩视频 | 天天操夜夜看 | 黄视频欧美| 国产欧美一区二区三区在线看 | 91 在线 | 在线视频一区二区三区 | 97av在线| 日韩在线视频免费观看 | 97av视频在线 | 人操人人干人 | 亚洲精品免费在线 | 日韩在线一区二区 | 亚洲国产精品网站 | 在线观看黄色大片 | 亚洲国产精品久久久久婷婷老年 | 91国自视频 | 久久精品亚洲精品国产欧美kt∨ | 无码日韩精品一区二区免费 | 日本国产欧美 | 欧美一级在线视频 | 欧美国产精品一区二区 | 日本精品久久 | av在线一区二区三区 | 中文字幕在线视频精品 | 国产精品久久久av | av在线亚洲天堂 | 欧美一区二区黄 | 成人精品系列 | 亚洲国产精品精华素 | 青青草原精品99久久精品66 |