Compartir a través de


LINQ to Entities

LINQ to Entities proporciona compatibilidad con Language-Integrated Query (LINQ) que permite a los desarrolladores escribir consultas en el modelo conceptual de Entity Framework mediante Visual Basic o Visual C#. Las consultas en Entity Framework se representan mediante consultas de árbol de comandos, que se ejecutan en el contexto del objeto. LINQ to Entities convierte las consultas Language-Integrated (LINQ) en consultas de árbol de comandos, ejecuta las consultas contra el Entity Framework y devuelve objetos que pueden ser utilizados tanto por Entity Framework como por LINQ. A continuación se muestra el proceso para crear y ejecutar una consulta LINQ to Entities:

  1. Construya una ObjectQuery<T> instancia de a partir de ObjectContext.

  2. Cree una consulta LINQ to Entities en C# o Visual Basic mediante la instancia de ObjectQuery<T>.

  3. Convierta operadores y expresiones de consulta estándar linQ en árboles de comandos.

  4. Ejecute la consulta, con representación de un árbol de comandos, en el origen de datos. Las excepciones producidas en el origen de datos durante la ejecución se pasan directamente al cliente.

  5. Devuelve los resultados de la consulta al cliente.

Construcción de una instancia de ObjectQuery

La clase ObjectQuery<T> genérica representa una consulta que devuelve una colección de cero o más entidades con tipo. Normalmente, una consulta de objeto se construye a partir de un contexto de objeto existente, en lugar de construirse manualmente y siempre pertenece a ese contexto de objeto. Este contexto proporciona la información de conexión y metadatos necesaria para redactar y ejecutar la consulta. La ObjectQuery<T> clase genérica implementa la IQueryable<T> interfaz genérica, cuyos métodos de generador permiten compilar consultas LINQ de forma incremental. También puede permitir que el compilador infiera el tipo de entidades mediante la palabra clave de C# var (Dim en Visual Basic, con la inferencia de tipos local habilitada).

Redacción de las consultas

Las instancias de la ObjectQuery<T> clase genérica, que implementa la interfaz genérica IQueryable<T> , sirven como origen de datos para las consultas LINQ to Entities. En una consulta, especifique exactamente la información que desea recuperar del origen de datos. Una consulta también puede especificar cómo se debe ordenar, agrupar y dar forma a esa información antes de que se devuelva. En LINQ, una consulta se almacena en una variable. Esta variable de consulta no realiza ninguna acción y no devuelve ningún dato; solo almacena la información de consulta. Después de crear una consulta, debe ejecutar esa consulta para recuperar los datos.

Las consultas LINQ to Entities se pueden componer en dos sintaxis diferentes: sintaxis de expresiones de consulta y sintaxis de consulta basada en métodos. La sintaxis de expresiones de consulta y la sintaxis de consulta basada en métodos son nuevas en C# 3.0 y Visual Basic 9.0.

Para obtener más información, vea Consultas en LINQ to Entities.

Conversión de las consultas

Para ejecutar una consulta LINQ to Entities en Entity Framework, la consulta LINQ debe convertirse en una representación de árbol de comandos que se pueda ejecutar en Entity Framework.

Las consultas LINQ to Entities se componen de operadores de consulta estándar LINQ (como Select, Where, y GroupBy) y expresiones (x > 10, Contact.LastName, y así sucesivamente). Los operadores LINQ no se definen mediante una clase, sino que son métodos de una clase. En LINQ, las expresiones pueden contener cualquier cosa permitida por tipos dentro del System.Linq.Expressions espacio de nombres y, por extensión, todo lo que se pueda representar en una función lambda. Se trata de un superconjunto de las expresiones permitidas por Entity Framework, que están restringidas por definición a las operaciones permitidas en la base de datos y compatibles con ObjectQuery<T>.

En Entity Framework, tanto los operadores como las expresiones se representan mediante una única jerarquía de tipos, que después se colocan en un árbol de comandos. Entity Framework usa el árbol de comandos para ejecutar la consulta. Si la consulta LINQ no se puede expresar como un árbol de comandos, se producirá una excepción cuando se convierta la consulta. La conversión de las consultas de LINQ to Entities implica dos subconversiones: la conversión de los operadores de consulta estándar y la conversión de las expresiones.

Hay una serie de operadores de consulta estándar LINQ que no tienen una traducción válida en LINQ to Entities. Los intentos de usar estos operadores producirán una excepción en el momento de la traducción de consultas. Para obtener una lista de los operadores de LINQ to Entities admitidos, vea Métodos LINQ admitidos y no admitidos (LINQ to Entities).

Para obtener más información sobre el uso de los operadores de consulta estándar en LINQ to Entities, vea Operadores de consulta estándar en consultas LINQ to Entities.

En general, las expresiones de LINQ to Entities se evalúan en el servidor, por lo que no se debe esperar que el comportamiento de la expresión siga la semántica clR. Para más información, consulte Expresiones en consultas de LINQ to Entities.

Para obtener información sobre cómo se asignan las llamadas a métodos CLR a funciones canónicas en el origen de datos, vea Método CLR a asignación de funciones canónicas.

Para obtener información sobre cómo llamar a funciones canónicas, de base de datos y personalizadas desde las consultas LINQ to Entities, vea Call Functions in LINQ to Entities Queries.

Ejecución de la consulta

Una vez creada la consulta LINQ por el usuario, se convierte en una representación compatible con Entity Framework (en forma de árboles de comandos), que se ejecuta a continuación en el origen de datos. En tiempo de ejecución de la consulta, todas las expresiones de consulta (o componentes de la consulta) se evalúan en el cliente o en el servidor. Esto incluye expresiones que se usan en la materialización de resultados o proyecciones de entidad. Para obtener más información, consulte Ejecución de consultas. Para obtener información sobre cómo mejorar el rendimiento mediante la compilación de una consulta una vez y, a continuación, ejecutarla varias veces con distintos parámetros, vea Consultas compiladas (LINQ to Entities) .

Materialización

La materialización es el proceso de devolver los resultados de la consulta al cliente como tipos CLR. En LINQ to Entities, nunca se devuelven los registros de datos de resultados de la consulta; siempre hay un tipo CLR de respaldo, definido por el usuario o por Entity Framework, o generado por el compilador (tipos anónimos). La materialización de todos los objetos se realiza mediante Entity Framework. Los errores derivados de la incapacidad de encontrar una correspondencia entre Entity Framework y CLR hará que se produzcan excepciones durante la materialización de los objetos.

Los resultados de la consulta normalmente se devuelven como uno de los siguientes:

  • Una colección de cero o más objetos de entidad tipificados o bien una proyección de tipos complejos definidos en el modelo conceptual.

  • Tipos CLR compatibles con Entity Framework.

  • Colecciones insertadas.

  • Tipos anónimos.

Para obtener más información, vea Resultados de la consulta.

En esta sección

Consultas en LINQ to Entities

Expresiones en consultas de LINQ to Entities

Llamada a funciones en consultas de LINQ to Entities

Consultas compiladas (LINQ to Entities)

Ejecución de consultas

Resultados de la consulta

Operadores de consulta estándar en consultas LINQ to Entities

Método CLR a la asignación de funciones canónicas

Métodos LINQ compatibles e incompatibles (LINQ to Entities)

Problemas conocidos y consideraciones en LINQ to Entities

Consulte también