啟用資料來源以進行 LINQ 查詢
您可以使用各種方式來擴充 LINQ,以啟用要在 LINQ 模式下進行查詢的任何資料來源。 資料來源可能是資料結構、Web 服務、檔案系統或資料庫等等。 LINQ 模式可以讓用戶端輕鬆查詢已啟用 LINQ 查詢的資料來源,因為查詢的語法和模式並未改變。 LINQ 可以擴充至這些資料來源的方式包括:
在型別中實作 IEnumerable<T> 介面,以啟用該型別的 LINQ to Objects 查詢功能。
為資料來源建立實作 IQueryable<T> 介面的提供者。 實作此介面的提供者是以運算式樹狀架構的形式接收 LINQ 查詢,而它可以自訂方式 (例如從遠端) 執行這些查詢。
為資料來源建立利用現有 LINQ 技術的提供者。 這種提供者不只會啟用查詢功能,也會插入、更新及刪除使用者定義型別的作業和對應。
本主題將討論這些選項。
如何啟用資料來源的 LINQ 查詢功能
記憶體中的資料
您可以使用兩種方式來啟用記憶體中資料的 LINQ 查詢功能。 如果資料屬於實作 IEnumerable<T> 的型別,您可以使用 LINQ to Objects 來查詢該資料。 如果透過實作 IEnumerable<T> 介面來啟用型別列舉啟用並不合理,您可以在該型別中定義 LINQ 標準查詢運算子方法,或是建立可擴充型別的 LINQ 標準查詢運算子方法。 標準查詢運算子的自訂實作 (Implementation) 應該會使用延後執行 (Deferred Execution) 來傳回結果。
遠端資料
啟用遠端資料來源之 LINQ 查詢的最佳選擇是實作 IQueryable<T> 介面。 不過,這與擴充資料來源之提供者 (例如 LINQ to SQL) 不同。 Visual Studio 2008 中並無任何提供者模型可用來將現有的 LINQ 技術 (例如 LINQ to SQL) 擴充至其他資料來源類型。
IQueryable LINQ 提供者
實作 IQueryable<T> 的 LINQ 提供者在複雜度上有很大的差異。 本節將討論不同層次的複雜度。
複雜度較低的 IQueryable 提供者可能會與 Web 服務的單一方法互動。 這種類型的提供者非常特別,因為它預期本身所處理的查詢中應該有特定的資訊。 這種提供者具有封閉型別系統,可能會公開單一結果型別。 多數的查詢執行工作都是在本機進行,例如利用標準查詢運算子的 Enumerable 實作。 複雜度較低的提供者可能只會在代表查詢的運算式樹狀架構中檢查一個方法呼叫運算式,並讓查詢的其餘邏輯在其他地方處理。
複雜度中等的 IQueryable 提供者可能以具有部分表示查詢語言的資料來源為目標。 若以 Web 服務做為目標,則其可能與該 Web 服務的多個方法連結,並依據查詢所提出的問題來選取要呼叫的方法。 中等複雜度的提供者擁有的型別系統雖然比簡單提供者更為多樣化,但仍然為固定型別系統。 例如,提供者可能會公開具有可周遊的一對多關聯性 (One-To-Many Relationship),但卻不會提供使用者定義型別的對應。
複雜的 IQueryable 提供者 (例如 LINQ to SQL 提供者) 可能會將完整的 LINQ 查詢解譯成表示查詢語言,例如 SQL。複雜的提供者比複雜度較低的提供者更為廣泛,因為它可以在查詢中處理更多種類的問題。 它也具有開放型別系統,因此必須包含廣泛的基礎結構,以對應使用者定義的型別。 開發複雜的提供者需要花費相當大量的心力。
如需如何自行建立 LINQ 提供者的詳細資訊,請參閱逐步解說:建立 IQueryable LINQ 提供者主題,以及 MSDN 部落格上的 LINQ:建置 IQueryable 提供者和連結至任何內容:LINQ 提供者清單文章 (英文)。