許多 C# 開發者對 IQueryable 與 IEnumerable 的區別存在誤解,以為前者僅是「資料庫查詢」、後者是「記憶體查詢」,且認為 IQueryable 速度較快、IEnumerable 通用性較強。這篇文章將釐清這些觀念。
IQueryable 基於表達式樹運作。當 C# 編譯器遇到 IQueryable 的查詢呼叫時,不會直接產生 IL 碼,而是建立一個 Expression 物件,以類似抽象語法樹的結構呈現查詢邏輯。這使得 LINQ Provider(如 LINQ to SQL)能在執行時解析篩選條件,轉換為 SQL 語句於資料庫端執行,達到延遲執行與伺服器端過濾的效果。
因為 LINQ Provider 無法將 C# 的自訂方法翻譯為對應的 SQL 操作。若需支援自訂邏輯,必須自行實作 Provider,或改用 IEnumerable 在記憶體中執行(但會先將資料完整載入)。
IQueryable 的查詢結果最終必須轉為 IEnumerable 才能迭代取值。兩者並非單純的效能高低,而是適用場景不同:IQueryable 適合遠端資料源(資料庫、OData),IEnumerable 適合本地集合運算。