C 學習筆記22 LINQ

2021-05-27 22:25:53 字數 3512 閱讀 1881

查詢表示式(linq)簡介

linq是language integratedquery的簡稱,它是整合在.net程式語言中的一種特性。已成為程式語言的乙個組成部分,在編寫程式時可以得到很好的編譯時語法檢查,豐富的元資料,智慧型感知、靜態型別等強型別語言的好處。並且它同時還使得查詢可以方便地對記憶體中的資訊進行查詢而不僅僅只是外部資料來源。

linq定義了一組標準查詢操作符用於在所有基於.net平台的程式語言中更加直接地宣告跨越、過濾和投射操作的統一方式,標準查詢操作符允許查詢作用於所有基於ienumerable介面的源,並且它還允許適合於目標域或技術的第三方特定域操作符來擴大標準查詢操作符集,更重要的是,第三方操作符可以用它們自己的提供附加服務的實現來自由地替換標準查詢操作符,根據linq模式的習俗,這些查詢喜歡採用與標準查詢操作符相同的語言整合和工具支援。

我們來總體看看linq架構

在.net3.5下,微軟為我們提供了一些命名空間

linq包括五個部分:linq to objects、linq to datasets、linq to sql、linq to entities、linq to xml。

linq to sql全稱基於關係資料的.net語言整合查詢,用於以物件形式管理關係資料,並提供了豐富的查詢功能。其建立於公共語言型別系統中的基於sql的模式定義的整合之上,當保持關係型模型表達能力和對底層儲存的直接查詢評測的效能時,這個整合在關係型資料之上提供強型別。

linq to xml在system.xml.linq命名空間下實現對xml的操作。採用高效、易用、記憶體中的xml工具在宿主程式語言中提供xpath/xquery功能等。

linq基本查詢操作

獲取資料源

在 linq 查詢中,第一步是指定資料來源。像在大多數程式語言中一樣,在 c# 中,必須先宣告變數,才能使用它。在 linq 查詢中,最先使用 from 子句的目的是引入資料來源 (customers) 和範圍變數 (cust)。

//queryallcustomers is an ienumerable

varqueryallcustomers = from cust in customers

select cust;

範圍變數類似於 foreach 迴圈中的迭代變數,但在查詢表示式中,實際上不發生迭代。執行查詢時,範圍變數將用作對 customers 中的每個後續元素的引用。因為編譯器可以推斷 cust 的型別,所以您不必顯式指定此型別。其他範圍變數可由 let 子句引入

篩選

也許最常用的查詢操作是應用布林表示式形式的篩選器。此篩選器使查詢只返回那些表示式結果為 true 的元素。使用 where 子句生成結果。實際上,篩選器指定從源序列中排除哪些元素。在下面的示例中,只返回那些位址位於倫敦的 customers。

var querylondoncustomers = from cust in customers

where cust.city == "london"

select cust;

您可以使用熟悉的 c# 邏輯 and 和 or 運算子來根據需要在 where 子句中應用任意數量的篩選表示式。例如,若要只返回位於「倫敦」and 姓名為「devon」的客戶,您應編寫下面的**:

where cust.city=="london" && cust.name== "devon"

若要返回位於倫敦或巴黎的客戶,您應編寫下面的**:

where cust.city == "london" || cust.city == "paris"

排序

通常可以很方便地將返回的資料進行排序。orderby 子句將使返回的序列中的元素按照被排序的型別的預設比較器進行排序。例如,下面的查詢可以擴充套件為按 name 屬性對結果進行排序。因為 name 是乙個字串,所以預設比較器執行從 a 到 z 的字母排序。

var querylondoncustomers3 =

from cust in customers

where cust.city == "london"

orderby cust.name ascending

select cust;

若要按相反順序(從 z 到 a)對結果進行排序,請使用 orderby…descending子句。

分組

使用 group 子句,您可以按指定的鍵分組結果。例如,您可以指定結果應按 city 分組,以便位於倫敦或巴黎的所有客戶位於各自組中。在本例中,cust.city 是鍵。

// querycustomersbycity is anienumerable>

var querycustomersbycity =

from cust in customers

group cust by cust.city;

// customergroup is anigrouping

foreach (var customergroup in querycustomersbycity)

", customer.name);}}

在使用 group 子句結束查詢時,結果採用列表的列表形式。列表中的每個元素是乙個具有 key 成員及根據該鍵分組的元素列表的物件。在迴圈訪問生成組序列的查詢時,您必須使用巢狀的 foreach 迴圈。外部迴圈用於迴圈訪問每個組,內部迴圈用於迴圈訪問每個組的成員。

如果您必須引用組操作的結果,可以使用 into 關鍵字來建立可進一步查詢的識別符號。下面的查詢只返回那些包含兩個以上的客戶的組:

// custquery is an ienumerable>

var custquery=

from cust in customers

group cust by cust.city intocustgroup

where custgroup.count() > 2

orderby custgroup.key

select custgroup;

聯接

聯接運算建立資料來源中沒有顯式建模的序列之間的關聯。例如,您可以執行聯接來查詢符合以下條件的所有客戶:位於巴黎,且從位於倫敦的**商處訂購產品。在 linq 中,join 子句始終針對物件集合而非直接針對資料庫表執行。在 linq 中,您不必像在 sql 中那樣頻繁使用 join,因為 linq 中的外來鍵在物件模型中表示為包含項集合的屬性。例如,customer 物件包含 order 物件的集合。不必執行聯接,只需使用點表示法訪問訂單:

選擇(投影)

select 子句生成查詢結果並指定每個返回的元素的「形狀」或型別。例如,您可以指定結果包含的是整個 customer 物件、僅乙個成員、成員的子集,還是某個基於計算或新物件建立的完全不同的結果型別。當 select 子句生成除源元素副本以外的內容時,該操作稱為「投影」。使用投影轉換資料是 linq 查詢表示式的一種強大功能。

linq to object

linq to sql

linq to dataset

linq to xml

linq to entity

C 學習筆記 22

在c 中,auto ptr是乙個類,它用來實現對動態分配物件的自動釋放。建構函式與析構函式 auto ptr在構造時獲取對某個物件的所有權 ownership 在析構時釋放該物件。我們可以這樣使用auto ptr來提高 安全性,類似下面的 int p new int 0 auto ptr ap p ...

C 學習筆記之 LINQ

linq language integrated query linq是.net框架的擴充套件,它允許我們以使用sql查詢資料庫的方式來查詢資料集合。使用linq,你可以從資料庫,程式物件的集合以及xml文件中查詢資料。查詢語句 using system using system.linq name...

Linq學習筆記

有如下一段 db.employess 是table型別,而table型別繼承了iqueryable,net3.5中的擴充套件方法特性,在queryable中定義了select where 等一系列方法,這些方法跟linq查詢中的關鍵字select where 等對應,linq 查詢語句,編譯後最終形...