LINQ (Language Integrated Query) 將查詢能力內建於語言,提供統一操作模式,無論資料來源為記憶體集合、資料庫、XML 或 Web Service。Linq to SQL 完美展示了這一架構。
當對 Table<TEntity> 使用 foreach 時,實際呼叫 IEnumerable<T>.GetEnumerator(),進而觸發 IProvider.Execute():
public IEnumerator<TEntity> GetEnumerator()
{
return ((IEnumerable<TEntity>)this.context.Provider
.Execute(Expression.Constant(this)).ReturnValue).GetEnumerator();
}
Execute 會依 Lambda 運算式生成 SQL、執行並回傳結果。
同樣是 Where,為何記憶體集合與資料庫行為不同?
Enumerable.Where 接受 Func<T, bool> 委派 → 編譯為匿名方法 → 記憶體中逐筆篩選Queryable.Where 接受 Expression<Func<T, bool>> → 編譯為運算式樹 → 由 IQueryProvider 解析轉譯為 SQLFunc<int, bool> f = x => x == 5; // 編譯為委派 (方法指標)
Expression<Func<int, bool>> e = x => x == 5; // 編譯為運算式樹 (資料結構)
運算式樹為遞迴結構:Parameters 為參數,Body 為巢狀 Expression。C# 編譯器完成了詞法與語法分析,將 Lambda 轉為樹狀結構,保留查詢語義供 Provider 後續解析。

IEnumerable/IQueryable 增加擴充方法 (利用 C# 語言特性)IQueryProvider,解析運算式樹生成特定查詢操作 (如 Linq to XML、Linq to SQL、Linq to LDAP 等)打造優良擴充系統,關鍵在於「提煉介面」——介面粒度、職責劃分決定系統彈性。透過介面隔離類別,將變化點封裝,正是 Linq 架構的精髓所在。