<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      LINQ之路 5:LINQ查詢表達式

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

      LINQ方法語法的本質是通過擴展方法和Lambda表達式來創建查詢。C# 3.0對于LINQ表達式還引入了聲明式的查詢表達式,也叫查詢語法,通常來講,它是創建LINQ查詢的更加快捷的方式。盡管通過查詢語法寫出的查詢比較類似于SQL查詢,但實際上查詢表達式的產生并不是建立在SQL之上,而是建立在函數式編程語言如LISP和Haskell中的list comprehensions(列表解析)功能之上。本篇會對LINQ查詢語法進行詳細的介紹。

      我們在前一篇LINAQ方法語法中所舉的示例:獲取所有包含字母”a”的姓名,按長度排序并將結果轉為大寫。下面是與之等價的查詢表達式語法:

              static void Main(string[] args)
      {
      string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

      IEnumerable<string> query =
      from n in names
      where n.Contains("a") // Filter elements
      orderby n n.Length // Sort elements, (orderby n 改為 orderby n.Length, 感謝網友搏擊的小船發現該處錯誤)
      select n.ToUpper(); // Translate each element

      foreach (string name in query)
      Console.WriteLine(name);
      }

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

      當然,.NET公共語言運行庫(CLR)并不具有查詢語法的概念。編譯器會在程序編譯時把查詢表達式轉換為方法語法,即對擴展方法的調用。這意味著,我們用查詢表達式寫出來的LINQ查詢都有等價的方法語法。對于上例中的查詢表達式,編譯器會轉換成下面的方法語法:

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

      然后,應用編譯器對于方法語法的處理規則,上面的Where, OrderBy, Select查詢運算符會綁定到Enumerable類中的相應擴展方法。

      范圍變量

      范圍變量是緊隨from關鍵字之后定義的變量,一個范圍變量指向當前操作符所對應的輸入sequence中的當前元素。在我們的示例中,范圍變量出現在每一個查詢子句中,但要注意的是,變量實際是對不同sequence的遍歷,因為Where、OrderBy、Select會有不同的輸入sequence:

                  IEnumerable<string> query =
      from n in names //n是我們定義的范圍變量
      where n.Contains("a") //n直接來自names array
      orderby n.Length //n來自filter之后的subsequent
      select n.ToUpper(); //n來自OrderBy之后的subsequent

      當 編譯器把上面的查詢語法翻譯成方法語法后,我們會更清楚的看到范圍變量的這種行為:

                  IEnumerable<string> query2 = names
      .Where(n => n.Contains("a")) //n直接來自names array
      .OrderBy(n => n.Length) //n來自filter之后的subsequent
      .Select(n => n.ToUpper()); //n來自OrderBy之后的subsequent

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

      • let
      • into
      • 額外的from子句

      稍后我們會在“LINQ中的子查詢、創建策略和數據轉換”一篇中討論他們的使用方法和適用場景。

      查詢表達式和方法語法

      查詢表達式和方法語法各有所長。對下面的場景來講,用查詢表達式寫出來得查詢會更加簡潔:

      • 使用let關鍵字引入新的范圍變量
      • 在SelectMany、Join或GroupJoin后引用外部范圍變量時

      在簡單的使用Where、OrderyBy、Select時,兩種語法結構并沒有大的差別,此時可以根據你的喜好任意選擇。

      對于只有單個查詢運算符組成的查詢,方法語法會更加簡短和易于理解。

      最后,對于沒有對應查詢表達式關鍵字的查詢運算符,我們就只能選擇方法語法了。下面是存在對應查詢表達式關鍵字的運算符:Where、Select、SelectMany、OrderBy、ThenBy、OrderByDescending、ThenByDescending、GroupBy、Join、GroupJoin。

      組合查詢語法

      當一個查詢運算符沒有對應的查詢語法時,我們可以組合使用查詢語法和方法語法。唯一的約束是查詢中的每一個查詢語法部分必須是完整的,如以from開始以select或group結束。如下例:

                  string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

      // 計算包含字母”a”的姓名總數
      int matches = (from n in names where n.Contains("a") select n).Count(); // 3
      // 按字母順序排序的第一個名字
      string first = (from n in names orderby n select n).First(); // Dick

      這種組合語法通常在書寫更加復雜的查詢時會具有優勢,像上面這種簡單的查詢,我們只需要使用方法語法就能收到很好的效果:

                   int matches = names.Where(n => n.Contains("a")).Count();    // 3
      string first = (names.OrderBy(n => n)).First(); // Dick
      posted @ 2011-10-28 15:20  Life a Poem  閱讀(18197)  評論(12)    收藏  舉報
      主站蜘蛛池模板: 日本一区二区三区四区黄色 | 亚洲乱码一区二区三区视色| 免费无码一区无码东京热| 加勒比中文字幕无码一区| 久久精品一本到99热免费| 国产对白老熟女正在播放| 亚洲欧美中文日韩V在线观看| 色综合伊人色综合网站| 2021av在线天堂网| 国产午夜成人久久无码一区二区| 欧美成a人片在线观看久| 不卡视频在线一区二区三区| 欧美成人精品三级在线观看| 麻豆国产传媒精品视频| 72种姿势欧美久久久久大黄蕉| 国产色无码专区在线观看| 国产美女午夜福利视频| 久久婷婷五月综合色精品| 中文字幕人妻色偷偷久久| 欧洲精品色在线观看| 免费人成视频x8x8国产| 日韩无矿砖一线二线卡乱| 亚洲色欲或者高潮影院| 国产精品午夜福利91| 久久精品熟女亚洲av麻| 精品熟女少妇免费久久| 久久av无码精品人妻出轨| 中文字幕日韩人妻一区| 又白又嫩毛又多15p| 亚洲精品日韩在线观看| 久久亚洲精品国产精品婷婷| 亚洲av成人无码精品电影在线| 99久久国产一区二区三区| 国产成人精品免费视频大全| 久久99精品久久久大学生| 野外做受三级视频| 香格里拉县| 亚洲精品国男人在线视频| 欧洲中文字幕一区二区| 青草视频在线观看视频| 夜夜添无码一区二区三区|