首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ 系列:基礎與本質(上)— 查詢運算子、Lambda 與編譯器映射機制

     編輯:關於.NET

C# 3.x 新特性(擴充方法、Lambda、匿名類型、物件初始化等)本質服務於 LINQ。理解這些特性後,認識 LINQ 變得簡單。

1. LINQ 簡介

統一查詢語法:對實作 IEnumerable<T> 物件、關聯資料庫、DataSet、XML 文件統一存取。嚴格說 LINQ 是一系列資料存取技術術語:

  • LINQ to Objects:記憶體集合
  • LINQ to SQL:關聯資料庫
  • LINQ to DataSet:DataSet 子集
  • LINQ to XML:XML 文件

強型別:編譯期保證語法正確。可擴展:第三方可用擴充方法定義新查詢運算子。

2. 核心組件

組件用途
System.Core.dll核心 LINQ API(必須引用)
System.Data.Linq.dllLINQ to SQL
System.Data.DataSetExtensions.dllLINQ to DataSet
System.Xml.Linq.dllLINQ to XML

VS2008 預設自動引用 System.Linq 命名空間。

3. 入門範例

static void QueryOverInts() {
    int[] numbers = { 10, 20, 28, 40, 1, 3, 5, 8 };
    // 查詢運算子語法
    IEnumerable<int> subset = from i in numbers where i < 10 select i;
    // Lambda 方法鏈語法
    IEnumerable<int> subset1 = numbers.Where(j => j < 10).OrderBy(j => j);
    foreach (int i in subset) Console.WriteLine("Item: {0}", i);
    foreach (int i in subset1) Console.WriteLine("Item: {0}", i);
}

4. 編譯器映射機制揭秘

查看 IL 代碼:

  • subset (查詢運算子) → IL 1-11 行
  • subset1 (Lambda) → IL 14-33 行

除委託快取變數名稱不同 (CS$<>9__CachedAnonymousMethodDelegate3/4),核心邏輯完全一致:均調用 Enumerable.Where<int32> 並傳入編譯器生成的靜態匿名方法 (<QueryOverInts>b__0/1)。

結論:C# 3.x 特性本質是編譯器層面的語法映射,CLR 層無新實質內容。編譯器將查詢運算子翻譯映射為 Lambda 形式。

5. LINQ 關鍵特性:延遲執行

numbers[0] = 5;  // 修改原始資料
foreach (int i in subset) Console.WriteLine(i);  // 輸出包含 5(而非原本 10)

查詢表達式僅在迭代訪問時計算執行,保證每次獲取最新資料。

6. 立即執行

.ToList<T>() 具體化結果集:

IEnumerable<int> subset3 = (from i in numbers where i < 10 select i).ToList<int>();

執行後結果集與查詢表達式無關,可獨立操作。

7. 核心支柱預告

頻繁出現的 System.Linq.Enumerable 與 System.Func 將在下篇深度解析。

待續…

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved