Condividi tramite


Esempio di provider LINQ to TerraServer

Aggiornamento: novembre 2007

Di seguito è riportato un esempio di provider LINQ personalizzato per il servizio Web TerraServer-USA. Viene inoltre illustrata un'applicazione client di esempio in cui il provider LINQ personalizzato viene utilizzato per eseguire una query sul servizio Web per trovare dati geografici.

Il servizio Web TerraServer-USA espone un metodo che restituisce informazioni sulle località degli Stati Uniti quando ne viene specificato il nome o parte del nome. Questo metodo, denominato GetPlaceList, viene chiamato dal provider LINQ per ottenere i dati su cui è stata eseguita la query LINQ. Il provider utilizza Windows Communication Foundation (WCF) per comunicare con il servizio Web. Per ulteriori informazioni sul servizio Web TerraServer-USA, vedere Overview of the TerraServer-USA Web Services (informazioni in lingua inglese).

Un provider LINQ che implementa l'interfaccia IQueryable<T>, come quello illustrato, consente di scrivere query LINQ sull'origine dati cui si connette. Un provider può eseguire la funzionalità della query sui dati stessi o può convertire la query LINQ in un linguaggio di query appropriato per l'origine dati cui si connette. Questo provider ottiene i dati dal servizio Web, quindi modifica la query originale in modo tale che LINQ to Objects ne gestisca l'esecuzione.

Nota sulla sicurezza:

In questo esempio di codice viene illustrato un concetto e viene presentato solo il codice rilevante. È possibile che questo esempio non soddisfi i requisiti di sicurezza per un ambiente specifico ed è opportuno non utilizzarlo così come viene riportato. È consigliabile aggiungere codice relativo alla sicurezza e alla gestione degli errori per rendere i progetti più sicuri e potenti. Microsoft fornisce questo esempio di codice "COSÌ COM'È" senza garanzie.

Per ottenere gli esempi e le istruzioni per installarli

  • Effettuare una o più operazioni seguenti:

    • Scegliere Esempi dal menu ?.

      Nel file Readme vengono visualizzate informazioni sugli esempi.

    • Visitare il sito Web Visual Studio 2008 Samples (informazioni in lingua inglese), in cui sono disponibili le versioni più recenti degli esempi.

Per ulteriori informazioni, vedere Individuazione dei file di esempio.

Nota:

Questo esempio è disponibile solo in linea.

Per eseguire l'applicazione client in Visual Studio

  1. Aprire il file LinqToTerraServerProvider.sln in Visual Studio.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto LinqToTerraServerProvider, quindi scegliere Compila.

  3. Scegliere Avvia senza eseguire debug dal menu Debug.

Requisiti

Per eseguire questo esempio, è necessario disporre dei seguenti componenti:

  • Visual Studio 2008

Dimostrazione

In questo esempio viene illustrato come implementare IQueryable<T>, IOrderedQueryable<T>, and IQueryProvider.

Decisioni di progettazione

Nella tabella seguente sono elencati i file nel progetto LinqToTerraServerProvider.

File

Descrizione

Evaluator.cs

Valuta parzialmente la struttura ad albero dell'espressione della query. In questo modo tutti i riferimenti alle variabili locali nella query LINQ vengono convertiti in valori.

ExpressionTreeHelpers.cs

Contiene i metodi che è possibile utilizzare per determinare informazioni ed estrarre dati da tipi specifici di strutture ad albero dell'espressione.

ExpressionTreeModifier.cs

Sottoclasse del visitatore della struttura ad albero dell'espressione che modifica la struttura ad albero dell'espressione che rappresenta la query LINQ completa.

ExpressionVisitor.cs

Classe di base del visitatore della struttura ad albero dell'espressione

InnermostWhereFinder.cs

Sottoclasse del visitatore della struttura ad albero dell'espressione che nella struttura ad albero dell'espressione della query trova l'espressione che rappresenta la chiamata più interna al metodo Where. Questa espressione più interna è l'espressione da cui il provider estrae i percorsi di ricerca.

InvalidQueryException.cs

Definisce un'eccezione generata quando viene inviata una query non valida.

LocationFinder.cs

Sottoclasse del visitatore della struttura ad albero dell'espressione che estrae le informazioni sulla località dalla query LINQ da utilizzare nella richiesta di servizio Web. Questa classe riconosce le informazioni sulla località fornite in uno dei formati seguenti:

  • Espressione di uguaglianza, ad esempio place.Name == "Seattle".

  • Espressione di chiamata al metodo per il metodo StartsWith, ad esempio place.Name.StartsWith("Seat").

  • Espressione di chiamata al metodo per i metodi Enumerable.Contains e List<T>.Contains, ad esempio placeList.Contains(place.Name).

Place.cs

Definisce un tipo .NET personalizzato per rappresentare i dati provenienti dal servizio Web.

QueryableTerraServerData.cs

Contiene il tipo su cui la query client definisce le query. Questo tipo implementa IOrderedQueryable<T> per supportare le operazioni di ordinamento nella query. Poiché IOrderedQueryable<T> deriva da IQueryable<T>, implementando IOrderedQueryable<T> questo tipo implementa anche IQueryable<T>.

TerraServerQueryContext.cs

Contiene una classe che organizza l'esecuzione di una query.

TerraServerQueryProvider.cs

Contiene il tipo che implementa l'interfaccia IQueryProvider. I metodi definiti da questa interfaccia vengono chiamati dai metodi degli operatori di query standard definiti in Queryable, per eseguire la query.

TypeSystem.cs

Questa classe di supporto implementa un metodo utilizzato per fornire il tipo di elemento dell'insieme generico che contiene i risultati della query.

WebServiceHelper.cs

Ottiene i dati dal servizio Web. Questo codice contiene due controlli che migliorano l'utilizzabilità della libreria del provider. Il primo controllo limita il tempo massimo di attesa di una risposta da parte di un'applicazione client limitando a cinque il numero totale di chiamate effettuate al servizio Web per ogni query. Il secondo controllo determina se il numero di risultati restituiti dal servizio Web è uguale al numero massimo di risultati che può restituire. Se il numero di risultati è il numero massimo, è probabile che i risultati del servizio Web vengano troncati. Anziché restituire un elenco incompleto al client, il provider genera un'eccezione.

Nella tabella seguente sono elencati i file del progetto ClientApp.

File

Descrizione

Program.cs

Contiene tre query LINQ di esempio eseguite sul tipo QueryableTerraServerData definito nel progetto LinqToTerraServerProvider.

app.config

Contiene un endpoint che definisce la modalità di comunicazione dell'applicazione con il servizio Web.

Per una descrizione più dettagliata della progettazione di questo provider LINQ personalizzato, vedere Procedura dettagliata: creazione di un provider LINQ IQueryable.

Vedere anche

Attività

Procedura: implementare un visitatore della struttura ad albero dell'espressione

Altre risorse

Esempi C# LINQ