LINQ教程之LINQ操作語(yǔ)法
LINQ查詢時(shí)有兩種語(yǔ)法可供選擇:查詢表達(dá)式語(yǔ)法(Query Expression)和方法語(yǔ)法(Fluent Syntax)。
一、查詢表達(dá)式語(yǔ)法
查詢表達(dá)式語(yǔ)法是一種更接近SQL語(yǔ)法的查詢方式。
LINQ查詢表達(dá)式語(yǔ)法如下:
from<range variable> in <IEnumerable<T> or IQueryable<T> Collection> <Standard Query Operators> <lambda expression> <select or groupBy operator> <result formation>
LINQ查詢表達(dá)式
| 約束 | LINQ查詢表達(dá)式必須以from子句開(kāi)頭,以select或group子句介紹 |
| 關(guān)鍵字 | 功能 |
| from....in... | 指定要查詢的數(shù)據(jù)源以及范圍變量,多個(gè)from子句則表示從多個(gè)數(shù)據(jù)源查找數(shù)據(jù)。注意:C#編譯器會(huì)把“復(fù)合from子句”的查詢表達(dá)式轉(zhuǎn)換為SelectMany()擴(kuò)展方法。 |
| join…in…on…equals… | 指定多個(gè)數(shù)據(jù)源的關(guān)聯(lián)方式 |
| let | 引入用于存儲(chǔ)查詢表達(dá)式中子表達(dá)式結(jié)果的范圍變量。通常能達(dá)到層次感會(huì)更好,使代碼更易于閱讀。 |
| orderby、descending | 指定元素的排序字段和排序方式。當(dāng)有多個(gè)排序字段時(shí),由字段順序確定主次關(guān)系,可指定升序和降序兩種排序方式 |
| where | 指定元素的篩選條件。多個(gè)where子句則表示了并列條件,必須全部都滿足才能入選。每個(gè)where子句可以使用謂詞&&、||連接多個(gè)條件表達(dá)式。 |
| group | 指定元素的分組字段。 |
| select | 指定查詢要返回的目標(biāo)數(shù)據(jù),可以指定任何類(lèi)型,甚至是匿名類(lèi)型。(目前通常被指定為匿名類(lèi)型) |
| into | 提供一個(gè)臨時(shí)的標(biāo)識(shí)符。該標(biāo)識(shí)可以引用join、group和select子句的結(jié)果。 1) 直接出現(xiàn)在join子句之后的into關(guān)鍵字會(huì)被翻譯為GroupJoin。(into之前的查詢變量可以繼續(xù)使用) 2) select或group子句之后的into它會(huì)重新開(kāi)始一個(gè)查詢,讓我們可以繼續(xù)引入where, orderby和select子句,它是對(duì)分步構(gòu)建查詢表達(dá)式的一種簡(jiǎn)寫(xiě)方式。(into之前的查詢變量都不可再使用) |
查詢語(yǔ)法從一個(gè)From子句開(kāi)始,然后是一個(gè)Range變量。 From子句的結(jié)構(gòu)類(lèi)似于“From rangeVariableName in IEnumerablecollection”。 在英語(yǔ)中,這意味著,從集合中的每個(gè)對(duì)象。 它類(lèi)似于foreach循環(huán):foreach(student in studentList)。
在From子句之后,您可以使用不同的標(biāo)準(zhǔn)查詢運(yùn)算符來(lái)過(guò)濾,分組,連接集合的元素。 LINQ中有大約50個(gè)標(biāo)準(zhǔn)查詢運(yùn)算符。標(biāo)準(zhǔn)查詢運(yùn)算符后面通常跟一個(gè)條件,這個(gè)條件通常使用lambda表達(dá)式來(lái)表示。
LINQ查詢語(yǔ)法總是以Select或Group子句結(jié)束。 Select子句用于對(duì)數(shù)據(jù)進(jìn)行整形。 您可以選擇整個(gè)對(duì)象,因?yàn)樗腔蛑挥兴囊恍傩浴?在上面的例子中,我們選擇了每個(gè)結(jié)果字符串元素。
例如:我們要從數(shù)組中查詢出偶數(shù),查詢表達(dá)式示例代碼如下:
var result = from p in ints where p % 2 == 0 select p;
查詢表達(dá)式語(yǔ)法要點(diǎn)總結(jié):
1、查詢表達(dá)式語(yǔ)法與SQL(結(jié)構(gòu)查詢語(yǔ)言)語(yǔ)法相同。
2、查詢語(yǔ)法必須以from子句開(kāi)頭,可以以Select或GroupBy子句結(jié)束 。
3、使用各種其他操作,如過(guò)濾,連接,分組,排序運(yùn)算符以構(gòu)造所需的結(jié)果。
4、隱式類(lèi)型變量 - var可以用于保存LINQ查詢的結(jié)果。
二、方法語(yǔ)法
方法語(yǔ)法(也稱(chēng)為流利語(yǔ)法)主要利用System.Linq.Enumerable類(lèi)中定義的擴(kuò)展方法和Lambda表達(dá)式方式進(jìn)行查詢,類(lèi)似于如何調(diào)用任何類(lèi)的擴(kuò)展方法。
以下是一個(gè)示例LINQ方法語(yǔ)法的查詢,返回?cái)?shù)組中的偶數(shù):
var result = ints.Where(p => p % 2 == 0).ToArray();
從上面的示例代碼中可以看出:方法語(yǔ)法包括擴(kuò)展方法和Lambda表達(dá)式。 擴(kuò)展方法Where()在Enumerable類(lèi)中定義。
如果你檢查Where擴(kuò)展方法的簽名,你會(huì)發(fā)現(xiàn)Where方法接受一個(gè)謂詞委托,如Func <Student,bool>。 這意味著您可以傳遞任何接受Student對(duì)象作為輸入?yún)?shù)的委托函數(shù),并返回一個(gè)布爾值,如下圖所示。 lambda表達(dá)式作為在Where子句中傳遞的委托傳遞。 在下一節(jié)中學(xué)習(xí)lambda表達(dá)式。

三、查詢表達(dá)式語(yǔ)法VS方法語(yǔ)法
查詢表達(dá)式語(yǔ)法與方法語(yǔ)法存在著緊密的關(guān)系
1、CLR本身并不理解查詢表達(dá)式語(yǔ)法,它只理解方法語(yǔ)法。
2、編譯器負(fù)責(zé)在編譯時(shí)將查詢表達(dá)式語(yǔ)法翻譯為方法語(yǔ)法。
3、大部分方法語(yǔ)法都有對(duì)應(yīng)的查詢表達(dá)式語(yǔ)法形式:如Select()對(duì)應(yīng)select、OrderBy()對(duì)應(yīng)orderby
4、部分查詢方法目前在C#中還沒(méi)有對(duì)應(yīng)的查詢語(yǔ)句:如Count()和Max(),這是只能采用以下替代方案:
方法語(yǔ)法
查詢表達(dá)式語(yǔ)法+方法語(yǔ)法的混合方式
到此這篇關(guān)于LINQ操作語(yǔ)法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用最小?WEB?API?實(shí)現(xiàn)文件上傳的Swagger支持
這篇文章主要介紹了使用最小?WEB?API?實(shí)現(xiàn)文件上傳Swagger支持,我們使用最小?WEB?API?實(shí)現(xiàn)文件上傳功能,雖然客戶端訪問(wèn)是正常的,但是當(dāng)打開(kāi)?Swagger?頁(yè)面時(shí),沒(méi)法使用?Swagger?頁(yè)面測(cè)試,下面就來(lái)一篇支持Swagger的,需要的小伙伴可以參考一下2022-02-02
基于.net standard 的動(dòng)態(tài)編譯實(shí)現(xiàn)代碼
這篇文章主要介紹了基于.net standard 的動(dòng)態(tài)編譯實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
.NET6創(chuàng)建Windows服務(wù)的實(shí)現(xiàn)步驟
本文主要介紹了.NET6創(chuàng)建Windows服務(wù)的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
解析ABP框架中的數(shù)據(jù)傳輸對(duì)象與應(yīng)用服務(wù)
ABP框架是基于ASP.NET的Web開(kāi)發(fā)框架,在ABP中應(yīng)用服務(wù)將領(lǐng)域邏輯暴露給展現(xiàn)層,展現(xiàn)層通過(guò)傳入數(shù)據(jù)傳輸對(duì)象參數(shù)來(lái)調(diào)用應(yīng)用服務(wù),而這里我們就來(lái)解析ABP框架中的數(shù)據(jù)傳輸對(duì)象與應(yīng)用服務(wù)2016-06-06
ASP.NET?MVC開(kāi)發(fā)接入微信公共平臺(tái)
這篇文章主要為大家介紹了微信平臺(tái)開(kāi)發(fā)ASP.NET?MVC接入微信公共平臺(tái)實(shí)現(xiàn)過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
ASP.NET WebForms實(shí)現(xiàn)全局異常捕獲與處理的最佳實(shí)踐
文章介紹了在ASP.NET WebForms中實(shí)現(xiàn)全局異常捕獲與處理的最佳實(shí)踐,包括在Global.asax中使用Application_Error、在Web.config中配置customErrors、在代碼中使用try-catch、全局異常過(guò)濾以及使用日志記錄庫(kù)等方法,感興趣的朋友一起看看吧2025-01-01
.NET?Core基于EMIT編寫(xiě)的輕量級(jí)AOP框架CZGL.AOP
這篇文章介紹了.NET?Core基于EMIT編寫(xiě)的輕量級(jí)AOP框架CZGL.AOP,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
ASP.NET網(wǎng)站的創(chuàng)建與發(fā)布過(guò)程簡(jiǎn)析
這篇文章主要介紹了ASP.NET的創(chuàng)建與發(fā)布過(guò)程,過(guò)程實(shí)現(xiàn)很簡(jiǎn)單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08

