C#3.0新增功能09 LINQ 基礎01 語言集成查詢
- 2019 年 10 月 4 日
- 筆記
語言集成查詢 (LINQ) 是一系列直接將查詢功能集成到 C# 語言的技術統稱。 數據查詢歷來都表示為簡單的字元串,沒有編譯時類型檢查或 IntelliSense 支援。 此外,需要針對每種類型的數據源了解不同的查詢語言:SQL 資料庫、XML 文檔、各種 Web 服務等。 藉助 LINQ,查詢成為了最高級的語言構造,就像類、方法和事件一樣。 可以使用語言關鍵字和熟悉的運算符針對強類型化對象集合編寫查詢。 LINQ 系列技術提供了針對對象 (LINQ to Objects)、關係資料庫 (LINQ to SQL) 和 XML (LINQ to XML) 的一致查詢體驗。
對於編寫查詢的開發者來說,LINQ 最明顯的「語言集成」部分就是查詢表達式。 查詢表達式採用聲明性查詢語法編寫而成。 使用查詢語法,可以用最少的程式碼對數據源執行篩選、排序和分組操作。 可使用相同的基本查詢表達式模式來查詢和轉換 SQL 資料庫、ADO .NET 數據集、XML 文檔和流以及 .NET 集合中的數據。
在 C# 中可為以下對象編寫 LINQ 查詢:SQL Server 資料庫、XML 文檔、ADO.NET 數據集以及支援 IEnumerable 或泛型 IEnumerable<T> 介面的任何對象集合。 此外,第三方也為許多 Web 服務和其他資料庫實現提供了 LINQ 支援。
下面的示例展示了完整的查詢操作。 完整的操作包括創建數據源、定義查詢表達式和在 foreach
語句中執行查詢。
class LINQQueryExpressions { static void Main() { // 指定數據源。 int[] scores = new int[] { 97, 92, 81, 60 }; // 定義查詢表達式 IEnumerable<int> scoreQuery = from score in scores where score > 80 select score; // 執行查詢 foreach (int i in scoreQuery) { Console.Write(i + " "); } } } // 輸出: 97 92 81
下圖為 Visual Studio 中的圖例,顯示了使用 C# 和 Visual Basic 針對 SQL Server 資料庫編寫的不完整 LINQ 查詢,並具有完全類型檢查和 IntelliSense 支援:

查詢表達式概述
- 查詢表達式可用於查詢並轉換所有啟用了 LINQ 的數據源中的數據。 例如,通過一個查詢即可檢索 SQL 資料庫中的數據,並生成 XML 流作為輸出。
- 查詢表達式易於掌握,因為使用了許多熟悉的 C# 語言構造。
- 查詢表達式中的變數全都是強類型,儘管在許多情況下,無需顯式提供類型,因為編譯器可以推斷出。 有關詳細資訊,請參閱 LINQ 查詢操作中的類型關係。
- 只有在循環訪問查詢變數後,才會執行查詢(例如,在
foreach
語句中)。 有關詳細資訊,請參閱 LINQ 查詢簡介。 - 在編譯時,查詢表達式根據 C# 規範規則轉換成標準查詢運算符方法調用。 可使用查詢語法表示的任何查詢都可以使用方法語法進行表示。 不過,在大多數情況下,查詢語法的可讀性更高,也更為簡潔。 有關詳細資訊,請參閱 C# 語言規範和標準查詢運算符概述。
- 通常,我們建議在編寫 LINQ 查詢時盡量使用查詢語法,並在必要時儘可能使用方法語法。 這兩種不同的形式在語義或性能上毫無差異。 查詢表達式通常比使用方法語法編寫的等同表達式更具可讀性。
- 一些查詢操作(如 Count 或 Max)沒有等效的查詢表達式子句,因此必須表示為方法調用。 可以各種方式結合使用方法語法和查詢語法。 有關詳細資訊,請參閱 LINQ 中的查詢語法和方法語法。
- 查詢表達式可被編譯成表達式樹或委託,具體視應用查詢的類型而定。IEnumerable<T> 查詢編譯為委託。 IQueryable 和 IQueryable<T> 查詢編譯為表達式樹。 有關詳細資訊,請參閱表達式樹。