LINQ to EntitiesLINQ 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#.LINQ to Entities provides Language-Integrated Query (LINQ) support that enables developers to write queries against the Entity Framework conceptual model using Visual Basic or Visual C#. Las consultas con Entity Framework se representan mediante consultas de árboles de comandos, que se ejecutan en el contexto del objeto.Queries against the Entity Framework are represented by command tree queries, which execute against the object context. 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.LINQ to Entities converts Language-Integrated Queries (LINQ) queries to command tree queries, executes the queries against the Entity Framework, and returns objects that can be used by both the Entity Framework and LINQ. A continuación se muestra el proceso para crear y ejecutar una consulta de LINQ to Entities.The following is the process for creating and executing a LINQ to Entities query:

  1. Cree una instancia de ObjectQuery<T> en ObjectContext.Construct an ObjectQuery<T> instance from ObjectContext.

  2. Cree una consulta de LINQ to Entities en C# o Visual Basic con la instancia de ObjectQuery<T>.Compose a LINQ to Entities query in C# or Visual Basic by using the ObjectQuery<T> instance.

  3. Convierta los operadores y expresiones de consulta estándar de LINQ en árboles de comandos.Convert LINQ standard query operators and expressions to command trees.

  4. Ejecute la consulta, con representación de un árbol de comandos, en el origen de datos.Execute the query, in command tree representation, against the data source. Las excepciones producidas en el origen de datos durante la ejecución se pasan directamente al cliente.Any exceptions thrown on the data source during execution are passed directly up to the client.

  5. Devuelva los resultados de la consulta al cliente.Return query results back to the client.

Crear una instancia de ObjectQueryConstructing an ObjectQuery Instance

La clase ObjectQuery<T> genérica representa una consulta que devuelve una colección de cero o más entidades con tipo.The ObjectQuery<T> generic class represents a query that returns a collection of zero or more typed entities. 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.An object query is typically constructed from an existing object context, instead of being manually constructed, and always belongs to that object context. Este contexto proporciona la información de metadatos y de conexión necesaria para crear y ejecutar la consulta.This context provides the connection and metadata information that is required to compose and execute the query. 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.The ObjectQuery<T> generic class implements the IQueryable<T> generic interface, whose builder methods enable LINQ queries to be incrementally built. 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).You can also let the compiler infer the type of entities by using the C# var keyword (Dim in Visual Basic, with local type inference enabled).

Crear consultasComposing the Queries

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.Instances of the ObjectQuery<T> generic class, which implements the generic IQueryable<T> interface, serve as the data source for LINQ to Entities queries. En una consulta se especifica exactamente la información que se desea recuperar del origen de datos.In a query, you specify exactly the information that you want to retrieve from the data source. Una consulta también puede especificar cómo se debe ordenar, agrupar y conformar esa información antes de que se devuelva.A query can also specify how that information should be sorted, grouped, and shaped before it is returned. En LINQ, una consulta se almacena en una variable.In LINQ, a query is stored in a variable. Esta variable de consulta no realiza ninguna acción y no devuelve datos; solamente almacena la información de la consulta.This query variable takes no action and returns no data; it only stores the query information. Tras crear una consulta debe ejecutarla para recuperar los datos.After you create a query you must execute that query to retrieve any data.

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.LINQ to Entities queries can be composed in two different syntaxes: query expression syntax and method-based query syntax. 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.Query expression syntax and method-based query syntax are new in C# 3.0 and Visual Basic 9.0.

Para obtener más información, consulte consultas en LINQ to Entities.For more information, see Queries in LINQ to Entities.

Conversión de las consultasQuery Conversion

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.To execute a LINQ to Entities query against the Entity Framework, the LINQ query must be converted to a command tree representation that can be executed against the Entity Framework.

Consultas LINQ to Entities están compuestas de operadores de consulta estándar LINQ (como Select, Where, y GroupBy) y expresiones (x > 10, Contact.LastName etc.).LINQ to Entities queries are comprised of LINQ standard query operators (such as Select, Where, and GroupBy) and expressions (x > 10, Contact.LastName, and so on). Los operadores de LINQ no se definen en una clase, sino que son los métodos de una clase.LINQ operators are not defined by a class, but rather are methods on a class. 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.In LINQ, expressions can contain anything allowed by types within the System.Linq.Expressions namespace and, by extension, anything that can be represented in a lambda function. 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>.This is a superset of the expressions that are allowed by the Entity Framework, which are by definition restricted to operations allowed on the database, and supported by 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.In the Entity Framework, both operators and expressions are represented by a single type hierarchy, which are then placed in a command tree. Entity Framework usa el árbol de comandos para ejecutar la consulta.The command tree is used by the Entity Framework to execute the query. Si la consulta de LINQ no se puede expresar como un árbol de comandos, se producirá una excepción cuando se convierta la consulta.If the LINQ query cannot be expressed as a command tree, an exception will be thrown when the query is being converted. 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.The conversion of LINQ to Entities queries involves two sub-conversions: the conversion of the standard query operators, and the conversion of the expressions.

Hay varios operadores de consulta estándar de LINQ que no tienen una conversión válida en LINQ to Entities.There are a number of LINQ standard query operators that do not have a valid translation in LINQ to Entities. Si se intenta usar estos operadores, se producirá una excepción al convertir la consulta.Attempts to use these operators will result in an exception at query translation time. Para obtener una lista de LINQ admitido a los operadores de entidades, vea admitidas y los métodos de LINQ no admitidos (LINQ to Entities).For a list of supported LINQ to Entities operators, see Supported and Unsupported LINQ Methods (LINQ to Entities).

Para obtener más información sobre cómo usar los operadores de consulta estándar en LINQ to Entities, vea operadores de consulta estándar en consultas LINQ to Entities.For more information about using the standard query operators in LINQ to Entities, see Standard Query Operators in LINQ to Entities Queries.

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.In general, expressions in LINQ to Entities are evaluated on the server, so the behavior of the expression should not be expected to follow CLR semantics. Para obtener más información, consulte expresiones en consultas LINQ to Entities.For more information, see Expressions in LINQ to Entities Queries.

Para obtener información sobre cómo se asignan llamadas a métodos CLR a funciones canónicas del origen de datos, vea método CLR a la asignación de función canónica.For information about how CLR method calls are mapped to canonical functions in the data source, see CLR Method to Canonical Function Mapping.

Para obtener información acerca de cómo llamar a canónica, la base de datos y funciones personalizadas desde LINQ to EntitiesLINQ to Entities consultas, vea llamar a funciones en consultas LINQ to Entities.For information about how to call canonical, database, and custom functions from within LINQ to EntitiesLINQ to Entities queries, see Calling Functions in LINQ to Entities Queries.

Ejecución de la consultaQuery Execution

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.After the LINQ query is created by the user, it is converted to a representation that is compatible with the Entity Framework (in the form of command trees), which is then executed against the data source. 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.At query execution time, all query expressions (or components of the query) are evaluated on the client or on the server. Esto incluye las expresiones que se usan en la materialización resultante o en las proyecciones de entidades.This includes expressions that are used in result materialization or entity projections. Para obtener más información, consulte ejecución de la consulta.For more information, see Query Execution. Para obtener 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).For information on how to improve performance by compiling a query once and then executing it several times with different parameters, see Compiled Queries (LINQ to Entities).

MaterializaciónMaterialization

La materialización es el proceso por el que se devuelven los resultados de la consulta al cliente en forma de tipos de CLR.Materialization is the process of returning query results back to the client as CLR types. 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).In LINQ to Entities, query results data records are never returned; there is always a backing CLR type, defined by the user or by the Entity Framework, or generated by the compiler (anonymous types). Entity Framework realiza la materialización de todos los objetos.All object materialization is performed by the 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.Any errors that result from an inability to map between the Entity Framework and the CLR will cause exceptions to be thrown during object materialization.

Los resultados de las consultas se suelen devolver en forma de alguno de los elementos siguientes.Query results are usually returned as one of the following:

  • 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.A collection of zero or more typed entity objects or a projection of complex types defined in the conceptual model.

  • Tipos CLR admitidos por Entity FrameworkEntity Framework.CLR types that are supported by the Entity FrameworkEntity Framework.

  • Colecciones insertadas.Inline collections.

  • Tipos anónimos.Anonymous types.

Para obtener más información, consulte resultados de la consulta.For more information, see Query Results.

En esta secciónIn This Section

Consultas en LINQ to EntitiesQueries in LINQ to Entities

Expresiones en consultas de LINQ to EntitiesExpressions in LINQ to Entities Queries

Llamada a funciones en consultas de LINQ to EntitiesCalling Functions in LINQ to Entities Queries

Consultas compiladas (LINQ to Entities)Compiled Queries (LINQ to Entities)

Ejecución de la consultaQuery Execution

Resultados de la consultaQuery Results

Operadores de consulta estándar en consultas de LINQ to EntitiesStandard Query Operators in LINQ to Entities Queries

Asignación de un método CLR a una función canónicaCLR Method to Canonical Function Mapping

Métodos de LINQ compatibles y no compatibles (LINQ to Entities)Supported and Unsupported LINQ Methods (LINQ to Entities)

Problemas conocidos y consideraciones en LINQ to EntitiesKnown Issues and Considerations in LINQ to Entities

Vea tambiénSee also