C# 3.x 新特性(擴充方法、Lambda、匿名類型、物件初始化等)本質服務於 LINQ。理解這些特性後,認識 LINQ 變得簡單。
統一查詢語法:對實作 IEnumerable<T> 物件、關聯資料庫、DataSet、XML 文件統一存取。嚴格說 LINQ 是一系列資料存取技術術語:
強型別:編譯期保證語法正確。可擴展:第三方可用擴充方法定義新查詢運算子。
| 組件 | 用途 |
|---|---|
System.Core.dll | 核心 LINQ API(必須引用) |
System.Data.Linq.dll | LINQ to SQL |
System.Data.DataSetExtensions.dll | LINQ to DataSet |
System.Xml.Linq.dll | LINQ to XML |
VS2008 預設自動引用 System.Linq 命名空間。
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);
}
查看 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 形式。
numbers[0] = 5; // 修改原始資料
foreach (int i in subset) Console.WriteLine(i); // 輸出包含 5(而非原本 10)
查詢表達式僅在迭代訪問時計算執行,保證每次獲取最新資料。
.ToList<T>() 具體化結果集:
IEnumerable<int> subset3 = (from i in numbers where i < 10 select i).ToList<int>();
執行後結果集與查詢表達式無關,可獨立操作。
頻繁出現的 System.Linq.Enumerable 與 System.Func 將在下篇深度解析。
待續…