啟用資料來源以進行 LINQ 查詢 (Visual Basic)

有許多方式可擴充 LINQ,以便在 LINQ 模式中查詢任何資料來源。 資料來源可能是資料結構、Web 服務、檔案系統或資料庫等等。 LINQ 模式可讓用戶端輕鬆查詢已啟用 LINQ 查詢的資料來源,因為查詢的語法和模式並未改變。 您可以透過下列方式將 LINQ 擴充至這些資料來源:

  • 在類型中實作 IEnumerable<T> 介面,以啟用該類型的 LINQ to Objects 查詢。

  • 建立可擴充類型的標準查詢運算子方法 (例如 WhereSelect),以啟用該類型的自訂 LINQ 查詢。

  • 為資料來源建立實作 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。 複雜的提供者比複雜度較低的提供者更為廣泛,因為它可以在查詢中處理更多種類的問題。 它也具有開放類型系統,因此必須包含廣泛的基礎結構,以對應使用者定義的類型。 開發複雜的提供者需要花費相當大量的心力。

另請參閱