Habilitar un origen de datos para realizar consultas LINQ
Existen varias maneras de extender LINQ para permitir consultar cualquier origen de datos en el modelo de LINQ. El origen de datos podría ser una estructura de datos, un servicio Web, un sistema de archivos o una base de datos, por nombrar algunos. El modelo de LINQ facilita a los clientes las consultas a un origen de datos para el que las consultas de LINQ están habilitadas, ya que la sintaxis y el modelo de la consulta no cambian. Las maneras en las que LINQ se puede extender a estos orígenes de datos son las siguientes:
Implementar la interfaz IEnumerable en un tipo para habilitar las consultas de LINQ to Objects para ese tipo.
Crear métodos de operador de consulta estándar como Where y Select que extienden un tipo para habilitar las consultas personalizadas de LINQ para ese tipo.
Crear un proveedor para el origen de datos que implementa la interfaz IQueryable. Un proveedor que implementa esta interfaz recibe consultas de LINQ en forma de árboles de expresión, que puede ejecutar de una manera personalizada, por ejemplo, remotamente.
Crear un proveedor para el origen de datos que aproveche una tecnología de LINQ existente. Este tipo de proveedor permitiría no sólo las consultas, sino también las operaciones de inserción, actualización y eliminación, así como la asignación para tipos definidos por el usuario.
En este tema se analizan estas opciones.
Cómo habilitar las consultas LINQ de un origen de datos
Datos en memoria
Hay dos maneras de habilitar las consultas de LINQ para datos en memoria. Si los datos son de un tipo que implementa IEnumerable, puede consultar los datos utilizando LINQ to Objects. Si no tiene sentido habilitar la enumeración de su tipo implementando la interfaz IEnumerable, puede definir métodos de operador de consulta estándar de LINQ en ese tipo o crear métodos de operador de consulta estándar de LINQ que extiendan el tipo. Las implementaciones personalizadas de los operadores de consulta estándar deberían utilizar ejecución diferida para devolver los resultados.
Datos remotos
La mejor opción para permitir las consultas de LINQ para un origen de datos remoto consiste en implementar la interfaz IQueryable. Sin embargo, esto es diferente de extender un proveedor como LINQ to SQL para un origen de datos. En Visual Studio 2008, no existen modelos de proveedor para extender tecnologías de LINQ existentes, como LINQ to SQL, a otros tipos de origen de datos.
Proveedores LINQ de IQueryable
Los proveedores de LINQ que implementan IQueryable pueden variar ampliamente en su complejidad. En esta sección se analizan los diferentes niveles de complejidad.
Un proveedor de IQueryable menos complejo podría interactuar con un solo método de un servicio Web. Este tipo de proveedor es muy específico, ya que espera información específica en las consultas que administra. Posee un sistema de tipos cerrado, y expone quizá un único tipo de resultado. La mayor parte de la ejecución de la consulta ocurre localmente, por ejemplo, utilizando las implementaciones Enumerable de los operadores de consulta estándar. Un proveedor menos complejo podría examinar sólo una expresión de llamada a método en el árbol de expresión que representa la consulta, y dejaría que la lógica restante de la consulta se procesara en otra parte.
Un proveedor IQueryable de complejidad media podría destinarse a un origen de datos que tuviera un lenguaje de consulta parcialmente expresivo. Si se destina a un servicio Web, podría comunicarse con más de un método del servicio Web y seleccionar el método que va a llamar en función de la pregunta que plantea la consulta. Un proveedor de complejidad media tendría un sistema de tipos más amplio que un proveedor simple, pero todavía sería un sistema de tipos fijo. Por ejemplo, el proveedor podría exponer tipos que tienen relaciones uno a varios y que se pueden recorrer, pero no proporcionaría tecnología de asignación para tipos definidos por el usuario.
Un proveedor IQueryable complejo, como el proveedor de LINQ to SQL, podría traducir consultas completas de LINQ en un lenguaje de consulta más expresivo, como SQL. Un proveedor complejo es más general que un proveedor menos complejo, porque puede controlar una gran variedad de preguntas en la consulta. También posee un sistema de tipos abierto y, por tanto, debe contener una amplia infraestructura para utilizar tipos definidos por el usuario. El desarrollo de un proveedor complejo requiere un esfuerzo significativo.
Para obtener más información sobre cómo crear su propio proveedor LINQ, vea las entradas de blog sobre LINQ: cómo compilar un proveedor IQueryable y Vínculo a cualquier contenido: lista de proveedores LINQ en MSDN.
Vea también
Referencia
Conceptos
Información general sobre operadores de consulta estándar