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

透視 Linq 架構:從 Linq to SQL 看 IEnumerable 與 IQueryable 的分野

     編輯:關於.NET

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、執行並回傳結果。

IEnumerable vs IQueryable:委派與運算式樹的關鍵差異

同樣是 Where,為何記憶體集合與資料庫行為不同?

  • Enumerable.Where 接受 Func<T, bool> 委派 → 編譯為匿名方法 → 記憶體中逐筆篩選
  • Queryable.Where 接受 Expression<Func<T, bool>> → 編譯為運算式樹 → 由 IQueryProvider 解析轉譯為 SQL

神奇的賦值運算子

Func<int, bool> f = x => x == 5;           // 編譯為委派 (方法指標)
Expression<Func<int, bool>> e = x => x == 5; // 編譯為運算式樹 (資料結構)

運算式樹為遞迴結構:Parameters 為參數,Body 為巢狀 Expression。C# 編譯器完成了詞法與語法分析,將 Lambda 轉為樹狀結構,保留查詢語義供 Provider 後續解析。

Linq 擴充兩大維度

Linq 架構圖

  1. 橫向擴充:對 IEnumerable/IQueryable 增加擴充方法 (利用 C# 語言特性)
  2. 縱向擴充:實作自訂 IQueryProvider,解析運算式樹生成特定查詢操作 (如 Linq to XML、Linq to SQL、Linq to LDAP 等)

核心啟示

打造優良擴充系統,關鍵在於「提煉介面」——介面粒度、職責劃分決定系統彈性。透過介面隔離類別,將變化點封裝,正是 Linq 架構的精髓所在。

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