共用方式為


LINQ to TerraServer 提供者範例

更新:2007 年 11 月

這個範例是自訂的 TerraServer-USA Web 服務 LINQ 提供者。其中還包含範例用戶端應用程式,會使用自訂 LINQ 提供者查詢 Web 服務中的地區資料。

TerraServer-USA Web 服務會公開一種方法,當給予方法部分或完整的地點名稱時,便會傳回美國境內地點的相關資訊。這個方法名為 GetPlaceList,是 LINQ 提供者呼叫的方法,用來取得 LINQ 查詢執行時依據的資料。提供者會使用 Windows Communication Foundation (WCF) 與 Web 服務進行通訊。如需 TerraServer-USA Web 服務的詳細資訊,請參閱 TerraServer-USA Web 服務概觀 (英文)。

像這樣實作 IQueryable<T> 介面的 LINQ 提供者,可讓您根據提供者連接的資料來源撰寫 LINQ 查詢。提供者可能在資料本身上執行查詢功能,或是將 LINQ 查詢轉譯為適用於所連接資料來源的查詢語言。這個提供者會從 Web 服務取得資料,然後修改原始查詢使 Objects 的 LINQ 處理查詢的執行動作。

安全性注意事項:

範例程式碼可說明整個概念,並顯示和此概念相關的程式碼。此程式碼可能不符合特定環境的安全性要求,您也不應該以範例所示的方法使用此程式碼。我們建議您新增安全性及錯誤處理程式碼,讓您的專案更安全完善。Microsoft 提供的程式碼未經修改,並且不對任何可能造成的後果負任何責任。

若要取得範例及其安裝指示

  • 執行下列其中一或多項作業:

    • 按一下 [說明] 功能表上的 [範例]。

      讀我檔案會顯示範例相關資訊。

    • 請造訪 Visual Studio 2008 範例網站 (英文)。您可以在此取得最新版本的範例。

如需詳細資訊,請參閱尋找範例檔案

注意事項:

這個範例僅可於線上使用。

在 Visual Studio 中執行用戶端應用程式

  1. 在 Visual Studio 中開啟 LinqToTerraServerProvider.sln 檔。

  2. 在 [方案總管] 中,以滑鼠右鍵按一下 [LinqToTerraServerProvider] 專案,然後按一下 [建置]。

  3. 在 [偵錯] 功能表上,請按 [啟動但不偵錯]。

需求

您需要下列元件才能執行這個範例:

  • Visual Studio 2008

示範

這個範例會示範如何實作 IQueryable<T>IOrderedQueryable<T>IQueryProvider

設計決策

下表列出 LinqToTerraServerProvider 專案中的檔案。

檔案

描述

Evaluator.cs

部分評估查詢的運算式樹狀架構。如此會將 LINQ 查詢中的所有本機變數參考轉譯成值。

ExpressionTreeHelpers.cs

包含的方法可用來判斷特定運算式樹狀架構型別的相關資訊,並從這些型別擷取資料。

ExpressionTreeModifier.cs

運算式樹狀架構訪問項子類別,可修改代表完整 LINQ 查詢的運算式樹狀架構。

ExpressionVisitor.cs

基底運算式樹狀架構訪問項類別。

InnermostWhereFinder.cs

運算式樹狀架構訪問項子類別,會在查詢的運算式樹狀架構中尋找代表最內部之 Where 方法呼叫的運算式。這個最內部的運算式就是提供者從中擷取搜尋地點的運算式。

InvalidQueryException.cs

定義在提交無效查詢時擲回的例外狀況。

LocationFinder.cs

運算式樹狀架構訪問項子類別,會從 LINQ 查詢中擷取要在 Web 服務要求中使用的地點資訊。這個類別可理解以下列其中一種形式提供的地點資訊:

  • 相等運算式,例如 place.Name == "Seattle"。

  • StartsWith 方法的方法呼叫運算式,例如 place.Name.StartsWith("Seat")。

  • Enumerable.ContainsList<T>.Contains 方法的方法呼叫運算式,例如 placeList.Contains(place.Name)。

Place.cs

定義自訂 .NET 型別以代表 Web 服務中的資料。

QueryableTerraServerData.cs

包含用戶端查詢定義查詢時依據的型別。這個型別會實作 IOrderedQueryable<T> 以支援查詢中的排序作業。由於 IOrderedQueryable<T> 衍生自 IQueryable<T>,因此藉由實作 IOrderedQueryable<T>,這個型別就同樣可以實作 IQueryable<T>

TerraServerQueryContext.cs

包含組織執行查詢之工作的類別。

TerraServerQueryProvider.cs

包含實作 IQueryProvider 介面的型別。這個介面定義的方法是由 Queryable 中定義的標準查詢運算子方法呼叫,以便執行查詢。

TypeSystem.cs

這個 Helper 類別會實作一個方法,用來提供包含查詢結果之泛型集合的項目型別。

WebServiceHelper.cs

取得 Web 服務的資料。這個程式碼包含兩項檢查,可增強提供者程式庫的使用性。第一項檢查將每項查詢呼叫 Web 服務的總次數限制為五次,藉以限制用戶端應用程式等候回應時間的上限。第二項檢查會判斷 Web 服務所傳回的結果數目是否等於它可以傳回的結果數目上限。如果結果的數目等於數目上限,則 Web 服務傳回的結果可能已經遭到刪減。此時提供者將會擲回例外狀況,而不會將不完整的清單傳回給用戶端。

下表列出 ClientApp 專案中的檔案。

檔案

描述

Program.cs

包含三個範例 LINQ 查詢,會查詢 LinqToTerraServerProvider 專案中定義的 QueryableTerraServerData 型別。

app.config

包含端點,會定義應用程式與 Web 服務進行通訊的方式。

如需設計這個自訂 LINQ 提供者的詳細討論,請參閱逐步解說:建立 IQueryable LINQ 提供者

請參閱

工作

HOW TO:實作運算式樹狀架構訪問項

其他資源

LINQ C# 範例