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 中執行用戶端應用程式
在 Visual Studio 中開啟 LinqToTerraServerProvider.sln 檔。
在 [方案總管] 中,以滑鼠右鍵按一下 [LinqToTerraServerProvider] 專案,然後按一下 [建置]。
在 [偵錯] 功能表上,請按 [啟動但不偵錯]。
需求
您需要下列元件才能執行這個範例:
- 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.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 提供者。