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

?


系列博客導航:

LINQ之路系列博客導航

LINQ之路?1:LINQ介紹

LINQ之路?2:C# 3.0的語言功能(上)

LINQ之路?3:C# 3.0的語言功能(下)

LINQ之路 4:LINQ方法語法

LINQ之路 5:LINQ查詢表達式

LINQ之路 6:延遲執行(Deferred Execution)

LINQ之路 7:子查詢、創建策略和數據轉換

LINQ之路 8:解釋查詢(Interpreted Queries)

LINQ之路 9:LINQ to SQL 和 Entity Framework(上)

LINQ之路10:LINQ to SQL 和 Entity Framework(下)

LINQ之路11:LINQ Operators之過濾(Filtering)

LINQ之路12:LINQ Operators之數據轉換(Projecting)

LINQ之路13:LINQ Operators之連接(Joining)

LINQ之路14:LINQ Operators之排序和分組(Ordering and Grouping)

LINQ之路15:LINQ Operators之元素運算符、集合方法、量詞方法

LINQ之路16:LINQ Operators之集合運算符、Zip操作符、轉換方法、生成器方法

LINQ之路17:LINQ to XML之X-DOM介紹

LINQ之路18:LINQ to XML之導航和查詢

LINQ之路19:LINQ to XML之X-DOM更新、和Value屬性交互

LINQ之路20:LINQ to XML之Documents、Declarations和Namespaces

LINQ之路21:LINQ to XML之生成X-DOM(Projecting)

LINQ之路系列博客后記

?

轉載于:https://www.cnblogs.com/lifepoem/archive/2011/10/28/2227735.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274865.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274865.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274865.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

調查謀殺案以換取Obra Dinn

回顧性 (RETROSPECTIVE) I am not sure if this is intentional, but Lucas Pope has a knack for turning the mundane into something special. This was evident in his release of Papers Please. In that game, you’re a border patrolman trying to provide for your fa…

9年前的大一,我們這樣為女生過37女生節【祝節日快樂】

這是一篇水文~沒啥目的&#xff0c;若說要有&#xff0c;就是希望大家參加源碼共讀學起來。公眾號后臺顯示所有讀者朋友中大約有23%的女生。前端工程師中女生應該占比相對多些。祝關注我公眾號的女生3.7女生節快樂&#xff0c;大部分公司明天應該都有半天假期。可以留言大學時你…

Jquery ajax 訪問調用帶參數的服務方法!

頁面腳本中的寫法: $.ajax({url: "http://localhost:3510/WebSite/WebService/ExceptionRecoder.asmx/SetExceptionInfo",contentType: "application/json; charsetutf-8", type: "POST", dataType: "js…

requests模塊發送帶headers的Get請求和帶參數的請求

1.在PyCharm開發工具中新建try_params.py文件&#xff1b; 2.try_params.py文件中編寫代碼&#xff1a; import requests#設置請求Headers頭部header {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}#請求輸入參數p…

面試官問:跨域請求如何攜帶cookie?

大家好&#xff0c;我是若?川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列本文…

Method not found: '!!0[] System.Array.Empty()'.

一開始不知道啥情況&#xff0c;原來是自己把.net 框架改成4.6.1了&#xff0c;客戶機是4.0 so.... 把項目改低點&#xff0c;就ok了。轉載于:https://www.cnblogs.com/ZaraNet/p/11100207.html

記錄點滴8

第8~9周 4月7日~4月22日 第八周的時候實在太多東西要做了&#xff0c;我把寫周記這件事給忘了&#xff0c;其實也沒太大關系&#xff0c;寫跟不寫之間也沒有太大的鴻溝&#xff0c;只是寫了之后&#xff0c;會讓我的記憶更加清晰&#xff0c;讓自己明白&#xff0c;最近自己做了…

ux設計中的各種地圖_移動應用程序設計中的常見UX錯誤

ux設計中的各種地圖Have you ever tried a new app, only to realize you have no idea how to use it?您是否曾經嘗試過一個新的應用程序&#xff0c;卻發現自己不知道如何使用它&#xff1f; Few things can transport a person from calm and happy, to frustrated and an…

如何使用 Node 后端創建 React 應用程序:完整指南

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列React…

FP error code老是忘記的看這里:只給出最常用的幾個。

把常見的幾個記牢&#xff0c;不要在比賽時糾結。 錯誤2&#xff1a;輸入文件未找到。 錯誤106&#xff1a;數據讀入的格式錯誤&#xff0c;往往是讀入語句出錯。 錯誤200&#xff1a;被零除。 錯誤201&#xff1a;范圍檢查錯誤&#xff0c;數組越界。 錯誤202&#xff1a;棧溢…

快速求冪算法

1 #include <stdio.h>2 #include <math.h>3 //遞歸算法4 int recursion(int a,int b)5 {6 int tem 1;7 if(b0)return 1;8 else if(b1)return a;9 tem recursion(a,b>>1); 10 tem tem*tem; 11 if(b&1) tem tem * a; 12 r…

工業儀器儀表 界面設計_如何設計時尚的儀表板界面

工業儀器儀表 界面設計重點 (Top highlight)Welcome to the second step by step UI guide. Since you really liked my first article on “How to achieve Friendly, Lightweight UI”, I decided to make another one in a similar manner. Please note, that this is not a…

linux ifconfig命令參數及用法詳解--linux查看配置網卡命令

ifconfig 是一個用來查看、配置、啟用或禁用網絡接口的工具&#xff0c;這個工具極為常用的。可以用這個工具來臨時性的配置網卡的IP地址、掩碼、廣播地址、網關等。也可以把 它寫入一個文件中&#xff08;比如/etc/rc.d/rc.local)&#xff0c;這樣系統引導后&#xff0c;會讀取…

給3月要跳槽的前端提個醒!不了解微前端就別去面試了,不然……

在后端架構發展史上&#xff0c;如果要找一個低耦合高內聚架構模式的典范&#xff0c;微服務當仁不讓。在互聯網業務急速擴張的背景下&#xff0c;微服務架構解決了后端服務中的“重”&#xff0c;讓每個服務都能夠獨立部署、獨立擴展&#xff0c;每個服務都具有穩固的模塊邊界…

調試 SharePoint 解決方案

調試 SharePoint 解決方案 可以使用 Visual Studio 調試器來調試 SharePoint 解決方案。 啟動調試后&#xff0c;Visual Studio 會將項目文件部署到 SharePoint Server&#xff0c;然后在Web 瀏覽器中打開 SharePoint 網站的一個實例。 以下各節說明如何在 Visual Studio 中調試…

ui和ux的區別_UI和UX之間的區別

ui和ux的區別You’ve probably heard a lot of self-proclaimed “UX/UI” designers out there, the word “UI” thrown around endlessly at Apple keynotes, or tech startups saying “we need to fix the UX here and the UX there.”?ouve可能聽說過很多自稱“UX / UI”…

給UIWebView增加搜索欄

在xib文件中拖入UIWebView。使用代碼為UIWebView的滾動控件增加搜索欄&#xff1a;UISearchBar* searchBar[[[UISearchBar alloc]initWithFrame:CGRectMake(0, -44, 320, 44)]autorelease];[self.browser.scrollView addSubview:searchBar];self.topBarsearchBar;[[self.browse…

用JS輕松實現一個錄音、錄像、錄屏工具庫

大家好&#xff0c;我是若川。持續組織了6個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列前言最…

文本字段和表單設計-UI組件系列

重點 (Top highlight)Forms have existed for a significant amount of time, greatly simplifying the task of drafting complaints and various other legal pleadings. With the advance of information and its processing, means to gather the data are also evolving. …

WCF 第四章 綁定 netMsmqBinding

MSMQ 為使用隊列創建分布式應用程序提供支持。WCF支持將MSMQ隊列作為netMsmqBinding綁定的底層傳輸協議的通信。 netMsmqBinding綁定允許客戶端直接把消息提交到一個隊列中同時服務端從隊列中讀取消息。客戶端和服務端之間沒有直接通信過程&#xff1b;因此&#xff0c;通信本 …