Share via


Requêtes d'objet (Entity Framework)

La classe générique ObjectQuery représente une requête qui retourne une collection de zéro, un ou plusieurs objets entité typés. Une requête d'objet appartient toujours à un contexte d'objet existant. Ce contexte fournit les informations relatives à la connexion et aux métadonnées qui sont requises pour composer et exécuter la requête. Un ObjectContext typé inclut un jeu de propriétés qui retournent des instances de ObjectQuery typées. Le modèle comprend l'une de ces propriétés pour chaque type d'entité. Ces propriétés simplifient la création d'une instance d'un ObjectQuery typé. Une requête d'objet est exécutée dans les scénarios suivants :

  • Lorsqu'une action est réalisée sur celle-ci, comme au cours d'une énumération foreach (en C#) ou For Each (en Visual Basic).

  • Lorsqu'elle est assignée pour remplir une collection List.

  • Lorsque la méthode Execute est explicitement appelée.

  • Lorsqu'un opérateur d'exécution de requête LINQ, tel que First ou Any est appelé. Pour plus d'informations, voir Méthodes du Générateur de requêtes (Entity Framework).

La requête suivante retourne un objet Contact dont le prénom et le nom sont spécifiés par les paramètres passés :

' Get the contacts with the specified name.
Dim contactQuery As ObjectQuery(Of Contact) = _
    context.Contact _
    .Where("it.LastName = @ln AND it.FirstName = @fn", _
    New ObjectParameter("ln", lastName), _
    New ObjectParameter("fn", firstName))
// Get the contacts with the specified name.
ObjectQuery<Contact> contactQuery = context.Contact
    .Where("it.LastName = @ln AND it.FirstName = @fn",
    new ObjectParameter("ln", lastName), 
    new ObjectParameter("fn", firstName));

Si vous souhaitez des exemples complets d'utilisation du contexte de l'objet pour composer et exécuter des requêtes, voir Procédure : exécuter une requête qui retourne un type d'entité (Entity Framework). Pour plus d'informations sur les requêtes Entité SQL, voir Langage Entity SQL.

Projection de requêtes

Si les requêtes d'objet sont utilisées pour retourner des données EDM (Modèle de données d'entité) en tant qu'objets entité, elles prennent aussi en charge des projections qui retournent des données qu'il est difficile de matérialiser en types d'entités. ObjectQuery utilise le type DbDataRecord pour les projections qui retournent autre chose que des types d'entités, comme des résultats imbriqués ou des types anonymes. Des types simples, comme Int32 ou String, sont utilisés avec les projections qui retournent des valeurs de propriété uniques.

La méthode du Générateur de requêtes Select retourne un objet ObjectQuery qui, lorsqu'il est exécuté, retourne une collection d'objets DbDataRecord. LINQ to Entities et Entité SQL prennent tous deux en charge la projection de requête. Reportez-vous aux rubriques suivantes pour obtenir des exemples de projection de requête :

Les considérations suivantes s'appliquent aux projections de requête :

  • Un ObjectQuery peut être initialisé de manière à représenter un résultat scalaire unique, plutôt qu'une collection de résultats scalaires. Certaines méthodes d'extension requièrent comme entrée des résultats sous forme de collection. Une exception ArgumentException est alors levée si l'une de ces méthodes est appelée, comme dans l'exemple suivant.

    ' Define a query projection that returns 
    ' a single scalar value rather than a collection.
    Dim scalarQuery As ObjectQuery(Of Int32) = _
        New ObjectQuery(Of Int32)("100", advWorksContext)
    
    ' Calling an extension method that requires a collection
    ' will result in an exception.
    Dim hasValues As Boolean = scalarQuery.Any()
    
    // Define a query projection that returns 
    // a single scalar value rather than a collection.
    ObjectQuery<Int32> scalarQuery = 
        new ObjectQuery<Int32>("100", advWorksContext);
    
    // Calling an extension method that requires a collection
    // will result in an exception.
    bool hasValues = scalarQuery.Any(); 
    
  • Si un ObjectQuery peut retourner une valeur null lorsqu'il est projeté vers un type primitif, vous devez utiliser la version nullable du type. La requête suivante utilise un DateTime nullable car la propriété ShipDate de l'objet SalesOrderHeader peut retourner une valeur null.

    Dim shipDateQuery As ObjectQuery(Of Nullable(Of Date)) = _
    advWorksContext.SalesOrderHeader _
        .Where("it.CustomerID = @contactId", _
            New ObjectParameter("contactId", contactId)) _
        .SelectValue(Of Nullable(Of Date))("it.ShipDate")
    
    ObjectQuery<Nullable<DateTime>> shipDateQuery =
        advWorksContext.SalesOrderHeader
        .Where("it.CustomerID = @contactId",
            new ObjectParameter("contactId", contactId))
        .SelectValue<Nullable<DateTime>>("it.ShipDate");
    

    Pour plus d'informations, voir Types nullables (Guide de programmation Visual Basic) ou Types nullables (Guide de programmation C#).

Définition du délai d'attente de commande

Le délai d'attente par défaut des requêtes d'objet et de l'opération SaveChanges est défini par le fournisseur de connexions sous-jacent. Toutefois, vous pouvez substituer cette valeur de délai d'attente par défaut en utilisant la propriété CommandTimeout sur le l'objet ObjectContext, comme indiqué dans l'exemple suivant.

' Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120
// Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120;

Effectuez cette substitution lorsque la requête est complexe ou lorsque d'autres problèmes de performances font que les requêtes ou les appels à la méthode SaveChanges dépassent fréquemment le délai d'attente.

Affichage des commandes de stockage

Lorsque vous exécutez une requête sur un modèle EDM, Entity Framework transforme les requêtes LINQ to Entities et les requêtes Entité SQL basées sur le modèle EDM en requêtes équivalentes exécutées sur la source de données. Object Services fournit la méthode ToTraceString qui vous permet d'afficher ces commandes de stockage pour un ObjectQuery au moment de l'exécution sans qu'il soit nécessaire d'exécuter une trace sur la source de données. Le fournisseur EntityClient propose également une méthode ToTraceString sur l'objet EntityCommand. Pour plus d'informations, voir Procédure : afficher les commandes de stockage (Entity Framework).

Récupération d'un objet par son EntityKey

Si vous connaissez la valeur de clé d'une entité, vous pouvez la récupérer à partir de la source de données sans créer et exécuter explicitement une requête d'objet. Les méthodes GetObjectByKey et TryGetObjectByKey de l'objet ObjectContext retournent alors un objet avec le EntityKey spécifié dans le contexte de l'objet. Lorsque vous utilisez la méthode GetObjectByKey, vous devez gérer un ObjectNotFoundException lorsque le EntityKey fourni ne correspond pas à une entité existante. Pour plus d'informations, voir Procédure : retourner un objet spécifique à l'aide de sa clé (Entity Framework).

Voir aussi

Concepts

Interrogation des données sous forme d'objets (Entity Framework)