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

LINQ 查詢操作全方位深度解析

     編輯:關於.NET

Language Integrated Query (LINQ) 是 Visual Studio 2008 與 .NET Framework 3.5 引入的里程碑式創新,它在物件世界與資料世界之間架起了強型別、編譯時期可驗證的橋樑。傳統上,查詢以字串形式表達 (如 SQL、XPath),缺乏 IntelliSense 與型別安全;LINQ 將查詢提升為 C# / VB 的第一級語言建構,讓開發者能用熟悉的關鍵字與運算子對強型別集合進行查詢。

LINQ 查詢三大核心階段

1. 取得資料來源

實作 IEnumerable<T> 介面的物件皆可作為 LINQ 資料來源:陣列 (T[])、List<T>、自訂集合、ADO.NET DataTable、XML 文件 (XElement) 等。資料來源決定了查詢的執行引擎:LINQ to Objects、LINQ to SQL、LINQ to XML、LINQ to Entities 等。

2. 建立查詢

查詢定義「要取什麼資料」以及「如何篩選、排序、分組、投影」。關鍵特性:**查詢變數本身不執行任何操作,也不回傳資料,它只是儲存查詢定義**。

// 查詢變數 numbersQuery 僅保存定義,尚未執行
var numbersQuery = from n in numbers
                   where n % 2 == 0
                   select n;

3. 執行查詢:延遲 vs 立即

3.1 延遲執行

查詢定義後不立即執行,而是在後續枚舉時 (如 foreach) 才真正逐筆產生結果。這帶來組合性優勢:可在執行前進一步修飾查詢 (加 Take、OrderBy 等)。

foreach (var n in numbersQuery) // 此處才真正執行查詢
    Console.WriteLine(n);

3.2 立即執行

套用會產生單一值的標準查詢運算子時,查詢會立即執行並回傳具體結果:

  • 聚合運算子:Count()、Max()、Average()、Sum()
  • 元素運算子:First()、Single()、ElementAt()
  • 轉換運算子:ToList()、ToArray()、ToDictionary()
// 立即執行並回傳 List<int>
var evensList = (from n in numbers where n % 2 == 0 select n).ToList();

// 立即執行並回傳偶數個數
int evenCount = (from n in numbers where n % 2 == 0 select n).Count();

查詢語法 vs 方法語法

C# 提供兩種等價語法:

  • 查詢語法 (類 SQL):from x in src where ... select ...,編譯器會轉換為方法呼叫。
  • 方法語法 (Fluent API):**src.Where(...).Select(...)**,適用於不支援查詢語法的運算子 (如 Count、Skip)。

兩者可自由混用,建議以可讀性為優先考量。

標準查詢運算子分類速查

分類代表運算子執行模式
篩選Where, OfType延遲
排序OrderBy, ThenBy, Reverse延遲
分組GroupBy, ToLookup延遲
投影Select, SelectMany延遲
聯結Join, GroupJoin延遲
集合Distinct, Union, Intersect, Except延遲
分頁Take, Skip, TakeWhile, SkipWhile延遲
量詞Any, All, Contains立即
聚合Count, Sum, Min, Max, Average, Aggregate立即
元素First, Last, Single, ElementAt, DefaultIfEmpty立即
轉換ToList, ToArray, ToDictionary, AsEnumerable立即

常見陷阱與最佳實務

  1. 多重枚舉效能陷阱:對同一延遲查詢執行多次 foreach 或 ToList() 會重複查詢資料來源。解法:以 ToList() 具體化後重用。
  2. 變數捕獲閉包:Lambda 中使用外部迴圈變數會捕獲參考而非值,導致非預期結果。解法:在迴圈內建立區域變數副本。
  3. IQueryable vs IEnumerable:LINQ to SQL/EF 回傳 IQueryable,查詢會轉譯為 SQL 在資料庫端執行;若過早呼叫 AsEnumerable() 或在記憶體中操作,會導致全表掃描。
  4. Null 傳播:查詢來源或導航屬性為 null 時,Select、Where 可能拋出 NullReferenceException。善用 ?. 或 DefaultIfEmpty() 防禦。

總結

掌握 LINQ 查詢的三階段生命週期、延遲與立即執行的區別、標準查詢運算子分類與執行語意,是寫出高效、可維護資料存取程式碼的基石。善用 LINQ 強型別優勢,將業務邏輯以宣告式方式表達,能顯著降低「字串 SQL」帶來的維護成本與執行風險。

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