本文部分內容整理自 MSDN,介紹 LINQ 基本概念、查詢運作三步驟、泛型類型與查詢語法。
LINQ(Language Integrated Query,語言整合查詢)是 .NET 語言內建的查詢特性,提供編譯期語法檢查、豐富中繼資料、IntelliSense 等強類型優勢。它是 Visual Studio 2008 與 .NET Framework 3.5 的突破性創新,橋接物件領域與資料領域。
傳統查詢以字串表示,缺乏編譯期檢查與 IntelliSense,且需針對不同資料源(SQL、XML、Web Service)學習不同語言。LINQ 使查詢成為 C#/VB 的一等語言構造,使用關鍵字與熟悉運算子針對強類型集合編寫查詢。支援資料源:SQL Server、XML、ADO.NET DataSet、實作 IEnumerable/IEnumerable<T> 的集合,並規劃支援 Entity Framework 與第三方提供者。
所有 LINQ 查詢包含三步驟:
範例:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums = from n in numbers
where n < 5
select n;
foreach (var x in lowNums) Console.WriteLine(x);
// 輸出:4, 1, 3, 2, 0
等同方法語法:
var lowNums = numbers.Where(n => n < 5).Select(n => n);
基礎知識:Func 泛型委派
Func<T, TResult> 封裝單一參數並回傳 TResult 的方法。Lambda 表達式 n => n < 5 相當於匿名委派 delegate(int n) { return n < 5; }。
Where 擴展方法原始碼:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
foreach (TSource item in source)
if (predicate(item)) yield return item;
}
資料源:陣列隱式支援 IEnumerable<T>,故可被 LINQ 查詢。支援 IEnumerable<T> 或 IQueryable<T> 的類型稱為「可查詢類型」。
查詢:指定要檢索的資訊、排序、分組、結構化。查詢變數儲存查詢表達式,本身不執行也不回傳資料。查詢表達式包含 from、where、select 子句(順序與 SQL 相反)。
執行查詢:foreach 迴圈即為執行過程。分為「強制立即執行」與「延遲執行」,後續詳細說明。
LINQ 查詢基於泛型。兩個基本概念:
List<T>)時,以實際類型取代 T,提供強類型與免轉換優勢。IEnumerable<T> 介面讓泛型集合可用 foreach 列舉。LINQ 查詢變數實作 IEnumerable<T>,表示執行時產生零或多個 T 物件的序列。IEnumerable<Customer> customerQuery = from cust in customers
where cust.City == "London"
select cust;
foreach (Customer c in customerQuery) Console.WriteLine(c.LastName + ", " + c.FirstName);