Interrogation et recherche d’entités

Cette rubrique décrit les différentes façons dont vous pouvez interroger des données à l’aide d’Entity Framework, notamment LINQ et la méthode Find. Les techniques présentées dans cette rubrique s’appliquent également aux modèles créés avec Code First et EF Designer.

Recherche d’entités à l’aide d’une requête

DbSet et IDbSet implémentent IQueryable et peuvent donc être utilisés comme point de départ pour écrire une requête LINQ sur la base de données. Ce n’est pas l’endroit approprié pour une discussion approfondie de LINQ, mais voici quelques exemples simples :

using (var context = new BloggingContext())
{
    // Query for all blogs with names starting with B
    var blogs = from b in context.Blogs
                   where b.Name.StartsWith("B")
                   select b;

    // Query for the Blog named ADO.NET Blog
    var blog = context.Blogs
                    .Where(b => b.Name == "ADO.NET Blog")
                    .FirstOrDefault();
}

Notez que DbSet et IDbSet créent toujours des requêtes sur la base de données et impliquent toujours un aller-retour vers la base de données même si les entités retournées existent déjà dans le contexte. Une requête est exécutée sur la base de données quand :

  • Il est énuméré par une instruction foreach (C#) ou For Each (Visual Basic).
  • Il est énuméré par une opération de collection telle que ToArray, ToDictionary ou ToList.
  • Les opérateurs LINQ tels que First ou Any sont spécifiés dans la partie la plus externe de la requête.
  • Les méthodes suivantes sont appelées : la méthode d’extension Load sur un DbSet, DbEntityEntry.Reload et Database.ExecuteSqlCommand.

Lorsque les résultats sont retournés à partir de la base de données, les objets qui n’existent pas dans le contexte sont attachés au contexte. Si un objet est déjà dans le contexte, l’objet existant est retourné (les valeurs actuelles et d’origine des propriétés de l’objet dans l’entrée ne sont pas remplacées par des valeurs de base de données).

Lorsque vous effectuez une requête, les entités qui ont été ajoutées au contexte mais qui n’ont pas encore été enregistrées dans la base de données ne sont pas retournées dans le cadre du jeu de résultats. Pour obtenir les données qui se trouve dans le contexte, consultez Données locales.

Si une requête ne retourne aucune ligne de la base de données, le résultat est une collection vide, plutôt que null.

Recherche d’entités à l’aide de clés primaires

La méthode Find sur DbSet utilise la valeur de clé primaire pour tenter de trouver une entité suivie par le contexte. Si l’entité est introuvable dans le contexte, une requête est envoyée à la base de données pour trouver l’entité là-bas. La valeur Null est retournée si l’entité n’est pas trouvée dans le contexte ou dans la base de données.

Trouver diffère de l’utilisation d’une requête de deux manières significatives :

  • Un aller-retour vers la base de données ne sera effectué que si l’entité avec la clé donnée n’est pas trouvée dans le contexte.
  • La recherche retourne les entités qui sont dans l’état Ajouté. Autrement dit, Find retourne les entités qui ont été ajoutées au contexte, mais qui n’ont pas encore été enregistrées dans la base de données.

Recherche d’une entité par clé primaire

Le code suivant montre certaines utilisations de Find :

using (var context = new BloggingContext())
{
    // Will hit the database
    var blog = context.Blogs.Find(3);

    // Will return the same instance without hitting the database
    var blogAgain = context.Blogs.Find(3);

    context.Blogs.Add(new Blog { Id = -1 });

    // Will find the new blog even though it does not exist in the database
    var newBlog = context.Blogs.Find(-1);

    // Will find a User which has a string primary key
    var user = context.Users.Find("johndoe1987");
}

Recherche d’une entité par clé primaire composite

Entity Framework permet à vos entités d’avoir des clés composites , c’est-à-dire une clé composée de plusieurs propriétés. Par exemple, vous pouvez avoir une entité BlogSettings qui représente des paramètres d’utilisateurs pour un blog particulier. Étant donné qu’un utilisateur n’aurait qu’un seul BlogSettings pour chaque blog, vous pouvez choisir de faire de la clé primaire de BlogSettings une combinaison de BlogId et username. Le code suivant tente de trouver le BlogSettings avec BlogId = 3 et Username = « johndoe1987 » :

using (var context = new BloggingContext())
{
    var settings = context.BlogSettings.Find(3, "johndoe1987");
}

Notez que lorsque vous avez des clés composites, vous devez utiliser ColumnAttribute ou l’API Fluent pour spécifier un ordre pour les propriétés de la clé composite. L’appel à Rechercher doit utiliser cet ordre lors de la spécification des valeurs qui forment la clé.