LINQ to EntitiesLINQ to Entities

LINQ to Entities assure une prise en charge de la technologie LINQ (Language Integrated Query), ce qui permet aux développeurs d’écrire des requêtes par rapport au modèle conceptuel Entity Framework à l’aide du langage Visual Basic ou 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#. Les requêtes exécutées avec Entity Framework sont représentées par des requêtes d'arborescence de commandes, lesquelles s'exécutent par rapport au contexte de l'objet.Queries against the Entity Framework are represented by command tree queries, which execute against the object context. LINQ to Entities convertit les requêtes LINQ (Language-Integrated Query) en requêtes d'arborescence de commandes, exécute les requêtes avec Entity Framework, puis retourne les objets qui peuvent être utilisés aussi bien par Entity Framework que par 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. Voici le processus de création et d'exécution d'une requête LINQ to Entities :The following is the process for creating and executing a LINQ to Entities query:

  1. Construisez une instance de l'objet ObjectQuery<T> à partir de l'objet ObjectContext.Construct an ObjectQuery<T> instance from ObjectContext.

  2. Composez une requête LINQ to Entities en C# ou en Visual Basic en utilisant l'instance de l'objet ObjectQuery<T>.Compose a LINQ to Entities query in C# or Visual Basic by using the ObjectQuery<T> instance.

  3. Convertissez les expressions et opérateurs de requête standard LINQ en arborescences de commandes.Convert LINQ standard query operators and expressions to command trees.

  4. Exécutez la requête dans l'arborescence des commandes sur la source de données.Execute the query, in command tree representation, against the data source. Toutes les exceptions levées sur la source de données pendant l'exécution sont passées directement au client.Any exceptions thrown on the data source during execution are passed directly up to the client.

  5. Retournez les résultats de la requête au client.Return query results back to the client.

Construction d'une instance d'ObjectQueryConstructing an ObjectQuery Instance

La classe générique ObjectQuery<T> représente une requête qui retourne une collection de zéro ou plusieurs entités typées.The ObjectQuery<T> generic class represents a query that returns a collection of zero or more typed entities. Une requête d'objet est généralement construite à partir d'un contexte d'objet existant, au lieu d'être construite manuellement, et appartient toujours à ce contexte d'objet.An object query is typically constructed from an existing object context, instead of being manually constructed, and always belongs to that object context. Ce contexte fournit les informations relatives à la connexion et aux métadonnées qui sont requises pour composer et exécuter la requête.This context provides the connection and metadata information that is required to compose and execute the query. La classe générique ObjectQuery<T> implémente l'interface générique IQueryable<T>, dont les méthodes de générateur permettent la construction incrémentielle de requêtes LINQ.The ObjectQuery<T> generic class implements the IQueryable<T> generic interface, whose builder methods enable LINQ queries to be incrementally built. Vous pouvez également permettre au compilateur de déduire le type des entités à l'aide du mot clé C# var (Dim en Visual Basic, avec l'inférence de type local activée).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).

Composition des requêtesComposing the Queries

Les instances de la classe générique ObjectQuery<T>, laquelle implémente l'interface générique IQueryable<T>, servent de source de données pour les requêtes 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. Dans une requête, vous spécifiez exactement les informations que vous voulez récupérer à partir de la source de données.In a query, you specify exactly the information that you want to retrieve from the data source. Une requête peut également spécifier la manière dont ces informations doivent être triées, regroupées et mises en forme avant d'être retournées.A query can also specify how that information should be sorted, grouped, and shaped before it is returned. Dans LINQ, une requête est stockée dans une variable.In LINQ, a query is stored in a variable. Cette variable de requête n'effectue aucune action et ne retourne aucune donnée ; elle stocke uniquement les informations de requête.This query variable takes no action and returns no data; it only stores the query information. Une fois que vous avez créé une requête, vous devez l'exécuter pour extraire des données.After you create a query you must execute that query to retrieve any data.

Les requêtes LINQ to Entities peuvent être composées dans deux syntaxes différentes : la syntaxe d'expression de requête et la syntaxe de requête fondée sur une méthode.LINQ to Entities queries can be composed in two different syntaxes: query expression syntax and method-based query syntax. La syntaxe d'expression de requête et la syntaxe de requête fondée sur une méthode sont nouvelles dans C# 3.0 et dans Visual Basic 9.0.Query expression syntax and method-based query syntax are new in C# 3.0 and Visual Basic 9.0.

Pour plus d’informations, consultez requêtes dans LINQ to Entities.For more information, see Queries in LINQ to Entities.

Conversion de requêteQuery Conversion

Pour exécuter une requête LINQ to Entities avec Entity Framework, cette requête doit être convertie en représentation arborescente des commandes qui peut être exécutée avec 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.

Les requêtes LINQ to Entities sont constituées d'opérateurs de requête standard LINQ (tels que Select, Where et GroupBy) et d'expressions (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). Les opérateurs LINQ ne sont pas définis par une classe ; ce sont des méthodes sur une classe.LINQ operators are not defined by a class, but rather are methods on a class. Dans LINQ, les expressions peuvent contenir tout ce que les types de l'espace de noms System.Linq.Expressions autorisent et, par extension, tout ce qui peut être représenté dans une fonction 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. Il s'agit d'un sur-ensemble des expressions qui sont autorisées par Entity Framework, lesquelles sont, par définition, limitées aux opérations autorisées sur la base de données et prises en charge par l'objet 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>.

Dans Entity Framework, les opérateurs et les expressions sont représentés par une seule hiérarchie des types, qui sont ensuite placés dans une arborescence de commandes.In the Entity Framework, both operators and expressions are represented by a single type hierarchy, which are then placed in a command tree. L'arborescence de commandes est utilisée par Entity Framework pour exécuter la requête.The command tree is used by the Entity Framework to execute the query. Si la requête LINQ ne peut pas être exprimée sous la forme d'une arborescence de commandes, une exception est levée au moment de la conversion de la requête.If the LINQ query cannot be expressed as a command tree, an exception will be thrown when the query is being converted. La conversion de requêtes LINQ to Entities implique deux sous-conversions : la conversion des opérateurs de requête standard et la conversion des expressions.The conversion of LINQ to Entities queries involves two sub-conversions: the conversion of the standard query operators, and the conversion of the expressions.

Plusieurs opérateurs de requête standard LINQ n'ont pas de traduction valide dans LINQ to Entities.There are a number of LINQ standard query operators that do not have a valid translation in LINQ to Entities. Les tentatives d'utilisation de ces opérateurs provoquent une exception au moment de la traduction de la requête.Attempts to use these operators will result in an exception at query translation time. Pour obtenir la liste de prise en charge opérateurs LINQ to Entities, consultez pris en charge et les méthodes non prises en charge de LINQ (LINQ to Entities).For a list of supported LINQ to Entities operators, see Supported and Unsupported LINQ Methods (LINQ to Entities).

Pour plus d’informations sur l’utilisation des opérateurs de requête standard dans LINQ to Entities, consultez des opérateurs de requête Standard dans les requêtes 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 règle générale, les expressions dans LINQ to Entities sont évaluées sur le serveur. Par conséquent, le comportement de l'expression n'est pas censé suivre la sémantique 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. Pour plus d’informations, consultez Expressions dans les requêtes LINQ to Entities.For more information, see Expressions in LINQ to Entities Queries.

Pour plus d’informations sur la façon dont les appels de méthode CLR sont mappés aux fonctions canoniques dans la source de données, consultez méthode CLR pour le mappage de fonction canonique.For information about how CLR method calls are mapped to canonical functions in the data source, see CLR Method to Canonical Function Mapping.

Pour plus d’informations sur la façon d’appeler canonique et la base de données et des fonctions personnalisées à partir LINQ to EntitiesLINQ to Entities de requêtes, consultez appel à des fonctions dans les requêtes 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.

Exécution de la requêteQuery Execution

Une fois la requête LINQ créée par l'utilisateur, elle est convertie en une représentation compatible avec Entity Framework (sous la forme d'arborescences de commandes), qui est ensuite exécutée sur la source de données.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. Au moment de l'exécution de la requête, l'ensemble des expressions de requête (ou des composants de la requête) sont évalués sur le client ou sur le serveur.At query execution time, all query expressions (or components of the query) are evaluated on the client or on the server. Cela comprend les expressions qui sont utilisées dans la matérialisation des résultats ou les projections d'entités.This includes expressions that are used in result materialization or entity projections. Pour plus d’informations, consultez l’exécution de requêtes.For more information, see Query Execution. Pour plus d’informations sur la façon d’améliorer les performances en compilant une requête une seule fois et puis l’exécuter plusieurs fois avec des paramètres différents, consultez requêtes compilées (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).

MatérialisationMaterialization

La matérialisation est le processus qui consiste à retourner les résultats d'une requête au client sous forme de types CLR.Materialization is the process of returning query results back to the client as CLR types. Dans LINQ to Entities, les enregistrements de données de résultats de requête ne sont jamais retournés ; il y a toujours un type CLR de sauvegarde, défini par l'utilisateur ou par Entity Framework, ou généré par le compilateur (types anonymes).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). Toute matérialisation d'objets est effectuée par Entity Framework.All object materialization is performed by the Entity Framework. Toute erreur qui résulte d'une impossibilité d'effectuer un mappage entre Entity Framework et le CLR lève une exception à lever pendant la matérialisation d'objets.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.

Les résultats de la requête sont généralement retournés sous l'une des formes suivantes :Query results are usually returned as one of the following:

  • une collection de zéro, un ou plusieurs objets entité typés ou une projection de types complexes définis dans le modèle conceptuel ;A collection of zero or more typed entity objects or a projection of complex types defined in the conceptual model.

  • des types CLR pris en charge par Entity FrameworkEntity Framework ;CLR types that are supported by the Entity FrameworkEntity Framework.

  • Collections inline.Inline collections.

  • Types anonymes.Anonymous types.

Pour plus d’informations, consultez résultats de la requête.For more information, see Query Results.

Dans cette sectionIn This Section

Requêtes dans LINQ to EntitiesQueries in LINQ to Entities

Expressions dans les requêtes LINQ to EntitiesExpressions in LINQ to Entities Queries

Appel de fonctions dans les requêtes LINQ to EntitiesCalling Functions in LINQ to Entities Queries

Requêtes compilées (LINQ to Entities)Compiled Queries (LINQ to Entities)

Exécution de la requêteQuery Execution

Résultats de requêteQuery Results

Opérateurs de requête standard dans les requêtes LINQ to EntitiesStandard Query Operators in LINQ to Entities Queries

Mappage de la méthode CLR aux fonctions canoniquesCLR Method to Canonical Function Mapping

Méthodes LINQ prises en charge et non prises en charge (LINQ to Entities)Supported and Unsupported LINQ Methods (LINQ to Entities)

Problèmes connus et éléments à prendre en compte dans LINQ to EntitiesKnown Issues and Considerations in LINQ to Entities

Voir aussiSee Also

Problèmes connus et éléments à prendre en compte dans LINQ to EntitiesKnown Issues and Considerations in LINQ to Entities
LINQ (Language Integrated Query)LINQ (Language-Integrated Query)
LINQ et ADO.NETLINQ and ADO.NET
ADO.NET Entity FrameworkADO.NET Entity Framework