Ejemplo LINQ to TerraServer Provider

Actualización: noviembre 2007

En este ejemplo se muestra un proveedor de LINQ personalizado para el servicio web TerraServer de Estados Unidos. También contiene una aplicación cliente de ejemplo que utiliza el proveedor de LINQ personalizado para consultar datos geográficos en el servicio web.

El servicio web TerraServer de Estados Unidos expone un método que devuelve información sobre ubicaciones geográficas de los Estados Unidos a partir del nombre o parte del nombre de la ubicación. Este método, denominado GetPlaceList, es el método al que llama el proveedor de LINQ para obtener los datos sobre los que se ejecuta la consulta LINQ. El proveedor utiliza Windows Communication Foundation (WCF) para comunicarse con el servicio web. Para obtener más información sobre el servicio web TerraServer de Estados Unidos, vea Overview of the TerraServer-USA Web Services.

Un proveedor de LINQ que implementa la interfaz IQueryable<T>, como el de este ejemplo, permite escribir consultas LINQ contra el origen de datos al que se conecta el proveedor. Un proveedor puede ejecutar la funcionalidad de consulta en los propios datos o bien traducir la consulta LINQ a un lenguaje de consulta adecuado para el origen de datos al que se conecta. Este proveedor obtiene datos del servicio web y, a continuación, modifica la consulta original de forma que LINQ to Objects controla la ejecución de la consulta.

Nota de seguridad:

En este ejemplo de código se ilustra un concepto y únicamente se muestra el código correspondiente a dicho concepto. Es posible que no cumpla los requisitos de seguridad de un entorno concreto y, por tanto, no debería utilizarse tal y como se muestra. Se recomienda agregar código de seguridad y de control de errores para que los proyectos sean más seguros y sólidos. Microsoft proporciona este ejemplo "tal cual" sin ninguna garantía.

Para obtener ejemplos e instrucciones para su instalación

  • Realice alguno de estos procedimientos:

    • En el menú Ayuda, haga clic en Ejemplos.

      En el archivo Léame se muestra información sobre los ejemplos.

    • Visite el sitio web de Visual Studio 2008 Samples. Encontrará allí las últimas versiones de ejemplos.

Para obtener más información, vea Localizar archivos de ejemplo.

Nota:

Este ejemplo sólo está disponible en línea.

Para ejecutar la aplicación cliente en Visual Studio

  1. Abra el archivo LinqToTerraServerProvider.sln en Visual Studio.

  2. En el Explorador de soluciones, haga clic con el botón secundario en el proyecto LinqToTerraServerProvider y, a continuación, haga clic en Generar.

  3. En el menú Depurar, haga clic en Iniciar sin depurar.

Requisitos

Para ejecutar este ejemplo, necesita los componentes siguientes:

  • Visual Studio 2008

Demostraciones

Este ejemplo muestra como implementar IQueryable<T>, IOrderedQueryable<T> y IQueryProvider.

Decisiones de diseño

En la tabla siguiente se enumeran los archivos del proyecto LinqToTerraServerProvider.

Archivo

Descripción

Evaluator.cs

Evalúa parcialmente el árbol de expresión de la consulta. De esta forma se traducen a valores todas las referencias a variables locales en la consulta LINQ.

ExpressionTreeHelpers.cs

Contiene métodos que se pueden utilizar para determinar información sobre datos de tipos específicos de árboles de expresión y extraer esos datos.

ExpressionTreeModifier.cs

Subclase visitante del árbol de expresión que modifica el árbol de expresión que representa la consulta LINQ completa.

ExpressionVisitor.cs

Clase base visitante del árbol de expresión

InnermostWhereFinder.cs

Subclase visitante del árbol de expresión que busca la expresión del árbol de expresión de la consulta que representa la llamada más interna al método Where. Esta expresión más interna es la expresión de la que el proveedor extrae las ubicaciones de búsqueda.

InvalidQueryException.cs

Define una excepción que se produce cuando se envía una consulta no válida.

LocationFinder.cs

Subclase visitante del árbol de expresión que extrae información de ubicación de la consulta LINQ para utilizarla en la solicitud del servicio web. Esta clase entiende la información de ubicación que se proporciona de una de las siguientes formas:

  • Una expresión de igualdad, por ejemplo place.Name == "Seattle".

  • Una expresión de llamada a método para el método StartsWith, por ejemplo place.Name.StartsWith("Seat").

  • Una expresión de llamada a método para los métodos Enumerable.Contains y List<T>.Contains, por ejemplo placeList.Contains(place.Name).

Place.cs

Define un tipo .NET personalizado para representar los datos del servicio web.

QueryableTerraServerData.cs

Contiene el tipo en el que la consulta del cliente define las consultas. Este tipo implementa IOrderedQueryable<T> para admitir operaciones de ordenación en la consulta. Dado que IOrderedQueryable<T> se deriva de IQueryable<T>, al implementar IOrderedQueryable<T>, este tipo también implementa IQueryable<T>.

TerraServerQueryContext.cs

Contiene una clase que organiza el trabajo que conlleva ejecutar una consulta.

TerraServerQueryProvider.cs

Contiene el tipo que implementa la interfaz IQueryProvider. Los métodos de operador de consulta estándar que se definen en Queryable llaman a los métodos que define esta interfaz para ejecutar la consulta.

TypeSystem.cs

Esta clase auxiliar implementa un método que se utiliza para proporcionar el tipo de elemento de la colección genérica que contiene los resultados de la consulta.

WebServiceHelper.cs

Obtiene datos del servicio web. Este código contiene dos comprobaciones que facilitan el uso de la biblioteca de proveedor. La primera comprobación limita el tiempo máximo que una aplicación cliente esperará una respuesta limitando el número total de llamadas que se realizan al servicio web a cinco por cada consulta. La segunda comprobación determina si el número de resultados devueltos por el servicio web es igual al número máximo de resultados que puede devolver. Si el número de resultados es el número máximo, es probable que los resultados del servicio web aparezcan truncados. En lugar de devolver una lista incompleta al cliente, el proveedor produce una excepción.

En la tabla siguiente se enumeran los archivos del proyecto ClientApp.

Archivo

Descripción

Program.cs

Contiene tres consultas LINQ de ejemplo que consultan el tipo QueryableTerraServerData definido en el proyecto LinqToTerraServerProvider.

app.config

Contiene un extremo que define cómo debe comunicarse la aplicación con el servicio web.

Para obtener una descripción más detallada del diseño de este proveedor de LINQ personalizado, vea Tutorial: Crear un proveedor LINQ IQueryable.

Vea también

Tareas

Cómo: Implementar un visitante de árbol de expresión

Otros recursos

Ejemplos de LINQ en C#