Language-Integrated Query (LINQ) 為 .NET 提供了一致的查詢模型,跨越 SQL 資料庫、XML 文件、ADO.NET DataSet、記憶體集合等異構資料源。開發者不再需要為每種資料源學習專用查詢語言(SQL、XQuery 等),而是使用統一的 C#/VB 語法與標準查詢運算子。
IEnumerable<T> 或 IQueryable<T> 的物件(陣列、List、XElement、DataContext 等)。var query = ...,**此時不執行任何資料存取**。foreach、ToList()、聚合函數(Count()、Max())等觸發實際執行。int[] numbers = { 0, 1, 2, 3, 4, 5, 6 };
// 1. 資料源
// 2. 建立查詢(延遲執行)
var numQuery = from num in numbers
where (num % 2) == 0
select num;
// 3. 執行查詢
foreach (int n in numQuery) Console.Write(n + " "); // 輸出: 0 2 4 6
任何實作 IEnumerable<T> 或衍生介面(IQueryable<T>)的型別皆為「可查詢型別」。
IEnumerable<T>。XElement.Load(...) 載入 XML 為可查詢型別。DataContext 對應資料表,Table<T> 實作 IQueryable<T>。C# 引入類 SQL 子句(from、where、select、orderby、group、join、let 等),編譯器將其轉換為標準查詢運算子方法呼叫。查詢變數本身不儲存結果,只儲存查詢定義。
預設行為:foreach 迭代時才逐筆產生結果。優點:
聚合函數(Count、Sum、Average、First、Single)需完整掃描來源,故立即執行並回傳單一值而非序列。
亦可主動快取結果:
List<int> cached = (from n in numbers where n % 2 == 0 select n).ToList();
int[] cachedArray = (from n in numbers where n % 2 == 0 select n).ToArray();
LINQ 將查詢提升為第一級語言建構,提供型別安全、IntelliSense、編譯時期檢查與除錯支援。掌握「建立與執行分離」是高效使用 LINQ 的關鍵——善用延遲執行特性組合查詢,僅在需要時具體化結果。