Fonctionnement des requêtesHow Queries Work

Entity Framework Core utilise LINQ (Language Integrated Query) pour interroger les données de la base de données.Entity Framework Core uses Language Integrated Query (LINQ) to query data from the database. LINQ vous permet d’utiliser C# (ou le langage .NET de votre choix) pour écrire des requêtes fortement typées en fonction de votre contexte dérivé et de vos classes d’entité.LINQ allows you to use C# (or your .NET language of choice) to write strongly typed queries based on your derived context and entity classes.

La durée de vie d’une requêteThe life of a query

Voici une vue d’ensemble de haut niveau du processus que chaque requête traverse.The following is a high level overview of the process each query goes through.

  1. La requête LINQ est traitée par Entity Framework Core pour générer une représentation qui est prête à être traitée par le fournisseur de base de donnéesThe LINQ query is processed by Entity Framework Core to build a representation that is ready to be processed by the database provider
    1. Le résultat est mis en cache afin que ce traitement n’ait pas besoin d’être effectué chaque fois que la requête est exécutéeThe result is cached so that this processing does not need to be done every time the query is executed
  2. Le résultat est transmis au fournisseur de base de donnéesThe result is passed to the database provider
    1. Le fournisseur de base de données identifie les parties de la requête qui peuvent être évaluées dans la base de donnéesThe database provider identifies which parts of the query can be evaluated in the database
    2. Ces parties de la requête sont traduites en langage de requête spécifique de base de données (par exemple, SQL pour une base de données relationnelle)These parts of the query are translated to database specific query language (for example, SQL for a relational database)
    3. Une ou plusieurs requêtes sont envoyées à la base de données et un jeu de résultats est retourné (les résultats sont des valeurs de la base de données, et non des instances d’entité)One or more queries are sent to the database and the result set returned (results are values from the database, not entity instances)
  3. Pour chaque élément du jeu de résultatsFor each item in the result set
    1. S’il s’agit d’une requête de suivi, EF vérifie si les données représentent une entité déjà présente dans le traceur de modifications pour l’instance de contexteIf this is a tracking query, EF checks if the data represents an entity already in the change tracker for the context instance
      • Dans ce cas, l’entité existante est retournéeIf so, the existing entity is returned
      • Si ce n’est pas le cas, une nouvelle entité est créée, le suivi des modifications est configuré, et la nouvelle entité est retournéeIf not, a new entity is created, change tracking is setup, and the new entity is returned
    2. S’il s’agit d’une requête sans suivi, EF vérifie si les données représentent une entité déjà présente dans le jeu de résultats pour cette requêteIf this is a no-tracking query, EF checks if the data represents an entity already in the result set for this query
      • Dans ce cas, l’entité existante est retournée (1)If so, the existing entity is returned (1)
      • Dans le cas contraire, une nouvelle entité est créée et retournéeIf not, a new entity is created and returned

(1) Les requêtes sans suivi utilisent les références faibles pour effectuer le suivi des entités qui ont déjà été retournées.(1) No tracking queries use weak references to keep track of entities that have already been returned. Si un résultat antérieur avec la même identité est hors de portée, et que le nettoyage de la mémoire s’exécute, vous risquez d’obtenir une nouvelle instance de l’entité.If a previous result with the same identity goes out of scope, and garbage collection runs, you may get a new entity instance.

Lorsque des requêtes sont exécutéesWhen queries are executed

Lorsque vous appelez des opérateurs LINQ, vous créez simplement une représentation en mémoire de la requête.When you call LINQ operators, you are simply building up an in-memory representation of the query. La requête est envoyée à la base de données uniquement lorsque les résultats sont consommés.The query is only sent to the database when the results are consumed.

Les opérations qui génèrent les requêtes envoyées à la base de données les plus courantes sont :The most common operations that result in the query being sent to the database are:

  • Itération des résultats dans une boucle forIterating the results in a for loop
  • Utilisation d’un opérateur tel que ToList, ToArray, Single, CountUsing an operator such as ToList, ToArray, Single, Count
  • Liaison des données des résultats d’une requête sur une interface utilisateurDatabinding the results of a query to a UI

Avertissement

Validez toujours l’entrée d’utilisateur : EF assure une protection contre les attaques par injection SQL, mais n’effectue aucune validation générale sur les entrées.Always validate user input: While EF does provide protection from SQL injection attacks, it does not do any general validation of input. Par conséquent, si les valeurs transmises aux API, utilisées dans les requêtes LINQ, affectées aux propriétés d’entité, etc., proviennent d’une source non fiable, vous devez effectuer une validation adéquate, selon vos besoins de l’application.Therefore if values being passed to APIs, used in LINQ queries, assigned to entity properties, etc., come from an untrusted source then appropriate validation, per your application requirements, should be performed. Cela inclut toute entrée utilisateur utilisée pour construire des requêtes de façon dynamique.This includes any user input used to dynamically construct queries. Même si vous utilisez LINQ, si vous acceptez les entrées utilisateur pour générer des expressions, vous devez vous assurer que seules les expressions prévues peuvent être construites.Even when using LINQ, if you are accepting user input to build expressions you need to make sure than only intended expressions can be constructed.