LINQ to Entities

LINQ to Entities proporciona la capacidad de realizar consultas integradas en lenguajes (LINQ) que permite a los desarrolladores de software escribir consultas contra el modelo conceptual de Entity Framework mediante Visual Basic o Visual C#. Las consultas con Entity Framework se representan mediante consultas de árboles de comandos, que se ejecutan en el contexto del objeto. LINQ to Entities convierte las consultas de Language-Integrated Queries (LINQ) en consultas de árboles de comandos, ejecuta las consultas en Entity Framework y devuelve objetos que se pueden usar tanto en Entity Framework como en LINQ. A continuación se muestra el proceso para crear y ejecutar una consulta de LINQ to Entities.

  1. Cree una instancia de ObjectQuery<T> en ObjectContext.

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

  3. Convierta los operadores y expresiones de consulta estándar de 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. Devuelva los resultados de la consulta al cliente.

Crear 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. Una consulta de objetos se suele crear a partir de un contexto del objeto existente, en lugar de crearse de forma manual, y siempre pertenece a dicho contexto. Este contexto proporciona la información de metadatos y de conexión necesaria para crear y ejecutar la consulta. La clase genérica ObjectQuery<T> implementa la interfaz genérica IQueryable<T>, cuyos métodos de generador permiten que las consultas de LINQ se generen de forma gradual. También puede dejar que el compilador deduzca el tipo de entidades utilizando la palabra clave var de C# (Dim en Visual Basic, con la inferencia de tipos locales habilitada).

Crear consultas

Las instancias de la clase genérica ObjectQuery<T>, que implementa la interfaz genérica IQueryable<T>, actúan como origen de datos para las consultas de LINQ to Entities. En una consulta se especifica exactamente la información que se desea recuperar del origen de datos. Una consulta también puede especificar cómo se debe ordenar, agrupar y conformar 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 datos; solamente almacena la información de la consulta. Tras crear una consulta debe ejecutarla para recuperar los datos.

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

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

Conversión de las consultas

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

Las consultas de LINQ to Entities están compuestas de operadores de consulta estándar de LINQ (como Select, Where y GroupBy) y expresiones (x > 10, Contact.LastName, etc.). Los operadores de LINQ no se definen en una clase, sino que son los métodos de una clase. En LINQ, las expresiones pueden contener todo lo que permitan los tipos dentro del espacio de nombres System.Linq.Expressions 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, por definición, están restringidas a las operaciones admitidas tanto en la base de datos como por ObjectQuery<T>.

En Entity Framework, tanto los operadores como las expresiones se representan mediante una jerarquía de tipos simple, que después se coloca en un árbol de comandos. Entity Framework usa el árbol de comandos para ejecutar la consulta. Si la consulta de 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 conversiones más: la de los operadores de consulta estándar y la de las expresiones.

Hay varios operadores de consulta estándar de LINQ que no tienen una conversión válida en LINQ to Entities. Si se intenta usar estos operadores, se producirá una excepción al convertir la consulta. Para obtener una lista de operadores de LINQ to Entities admitidos, consulte 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, consulte Operadores de consulta estándar en consultas de LINQ to Entities.

En general, las expresiones de LINQ to Entities se evalúan en el servidor, de modo que es previsible que el comportamiento de la expresión no siga la semántica de CLR. Para más información, consulte Expresiones en consultas de LINQ to Entities.

Para más información sobre cómo se asignan las llamadas de método CLR a funciones canónicas en el origen de datos, consulte Asignar un método CLR a una función canónica.

Para más información sobre cómo llamar a funciones canónicas, de base de datos y personalizadas desde consultas de LINQ to Entities, consulte Llamar a funciones en consultas de LINQ to Entities.

Ejecución de la consulta

Una vez que el usuario crea una consulta de LINQ, esta se convierte en una representación compatible con Entity Framework (en forma de árboles de comandos), que después se ejecuta en el origen de datos. En el momento de ejecutar la consulta, todas las expresiones de consulta (o sus componentes) se evalúan en el cliente o en el servidor. Esto incluye las expresiones que se usan en la materialización resultante o en las proyecciones de entidades. Para más información, consulte Ejecución de consultas. Para más información sobre cómo mejorar el rendimiento compilando una consulta una vez y ejecutándola después varias veces con parámetros diferentes, consulte Consultas compiladas (LINQ to Entities).

Materialización

La materialización es el proceso por el que se devuelven los resultados de la consulta al cliente en forma de tipos de CLR. En LINQ to Entities, los registros de datos de los resultados de las consultas no se devuelven nunca; siempre hay un tipo de CLR correspondiente, definido por el usuario o por Entity Framework, o generado por el compilador (tipos anónimos). Entity Framework realiza la materialización de todos los objetos. 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 las consultas se suelen devolver en forma de alguno de los elementos siguientes.

  • Una colección con cero o más objetos entidad con tipo o una proyección de tipos complejos que se define en el modelo conceptual.

  • Tipos CLR que admite Entity Framework.

  • Colecciones insertadas.

  • Tipos anónimos.

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

En esta sección

Consultas en LINQ to Entities

Expresiones en consultas de LINQ to Entities

Llamar a funciones en consultas de LINQ to Entities

Consultas compiladas (LINQ to Entities)

Ejecución de la consulta

Resultados de la consulta

Operadores de consulta estándar en consultas de LINQ to Entities

Asignar un método CLR a una función canónica

Métodos de LINQ compatibles y no compatibles (LINQ to Entities)

Problemas conocidos y consideraciones en LINQ to Entities

Consulte también