Partager via


Fonctionnement des requêtes

Entity Framework Core utilise LINQ (Language Integrated Query) pour interroger les données de la base de données. 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é.

Remarque

Cet article est obsolète et certaines parties de celui-ci doivent être mises à jour pour tenir compte des modifications apportées à la conception du pipeline de requête. Si vous avez des doutes sur les comportements mentionnés ici, merci de poser une question.

La durée de vie d’une requête

La description suivante est une vue d’ensemble de haut niveau du processus que chaque requête traverse.

  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ées
    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ée
  2. Le résultat est transmis au fournisseur de base de données
    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ées
    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)
    3. Une requête est envoyée à 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é)
  3. Pour chaque élément du jeu de résultats
    1. Si la requête est 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 contexte
      • Dans ce cas, l’entité existante est retournée
      • 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ée
    2. Si la requête est une requête sans suivi, une nouvelle entité est toujours créée et retournée

Lorsque des requêtes sont exécutées

Lorsque vous appelez des opérateurs LINQ, vous créez simplement une représentation en mémoire de la requête. La requête est envoyée à la base de données uniquement lorsque les résultats sont consommés.

Les opérations qui génèrent les requêtes envoyées à la base de données les plus courantes sont :

  • Itération des résultats dans une boucle for
  • Utilisation d’un opérateur tel que ToList, ToArray, Single, Count ou les surcharges Async équivalentes

Avertissement

Toujours valider l’entrée d’utilisateur : bien qu’EF Core protège contre les attaques par injection SQL au moyen de paramètres et de l’échappement des littéraux dans les requêtes, il ne valide pas les entrées. Vous devez effectuer une validation adéquate, conformément aux exigences de l’application, avant que les valeurs provenant d’une source non fiable soient utilisées dans des requêtes LINQ, affectées à des propriétés d’entité ou transmises à d’autres API EF Core. Cela inclut toute entrée utilisateur utilisée pour construire des requêtes de façon dynamique. Même si vous utilisez LINQ, si vous acceptez les entrées d’utilisateur pour générer des expressions, vous devez vous assurer que seules les expressions prévues peuvent être construites.