Partager via


Procédure : charger explicitement des objets connexes (Entity Framework)

Cette rubrique fournit des exemples de chargement explicite d'objets connexes.

Le premier exemple utilise la méthode Load sur EntityCollection pour charger explicitement tous les ordres et éléments pour un client unique. La méthode Load ne peut pas être utilisée avec les entités POCO parce que les propriétés de navigation des entités POCO ne sont pas obligatoires pour retourner EntityCollection. Pour plus d'informations, consultez Chargement d'entités POCO connexes (Entity Framework).

Le deuxième exemple utilise la méthode CreateSourceQuery pour créer une requête qui charge uniquement les commandes sélectionnées avec les éléments connexes. Ces commandes sont ensuite attachées au client.

Vous pouvez également utiliser la méthode LoadProperty de la classe ObjectContext pour charger des objets connexes. La méthode LoadProperty peut être utilisée avec les entités POCO et avec les entités dérivées de EntityObject.

Les exemples de cette rubrique sont basés sur le modèle de vente Adventure Works Sales Model. Pour plus d'informations, consultez Procédure : utiliser l'Assistant Entity Data Model (Entity Framework).

Exemple

L'exemple suivant charge des objets SalesOrderHeader qui appartiennent à un même Contact, puis itère au sein des objets SalesOrderHeader de l'objet EntityCollection. Sur chaque objet SalesOrderHeader de la collection, la méthode Load est appelée pour récupérer la collection d'objets SalesOrderDetail connexes à partir de la base de données.

' Specify the customer ID. 
Dim contactID As Integer = 4332

Using context As New AdventureWorksEntities()
    context.ContextOptions.LazyLoadingEnabled = False

    ' Get a specified customer by contact ID. 
    Dim contact = (From c In context.Contacts
        Where c.ContactID = contactID
        Select c).First()

    ' Load the orders for the customer explicitly. 
    If Not contact.SalesOrderHeaders.IsLoaded Then
        contact.SalesOrderHeaders.Load()
    End If

    For Each order As SalesOrderHeader In contact.SalesOrderHeaders
        ' Load the items for the order if not already loaded. 
        If Not order.SalesOrderDetails.IsLoaded Then
            order.SalesOrderDetails.Load()
        End If

        Console.WriteLine(String.Format("PO Number: {0}", order.PurchaseOrderNumber))
        Console.WriteLine(String.Format("Order Date: {0}", order.OrderDate.ToString()))
        Console.WriteLine("Order items:")
        For Each item As SalesOrderDetail In order.SalesOrderDetails
            Console.WriteLine(String.Format("Product: {0} Quantity: {1}", _
                                              item.ProductID.ToString(), item.OrderQty.ToString()))
        Next
    Next
End Using
// Specify the customer ID.
int contactID = 4332;

using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    context.ContextOptions.LazyLoadingEnabled = false;

    // Get a specified customer by contact ID.
    var contact =
        (from c in context.Contacts
         where c.ContactID == contactID
         select c).First();

    // Load the orders for the customer explicitly.
    if (!contact.SalesOrderHeaders.IsLoaded)
    {
        contact.SalesOrderHeaders.Load();
    }

    foreach (SalesOrderHeader order in contact.SalesOrderHeaders)
    {
        // Load the items for the order if not already loaded.
        if (!order.SalesOrderDetails.IsLoaded)
        {
            order.SalesOrderDetails.Load();
        }

        Console.WriteLine(String.Format("PO Number: {0}",
            order.PurchaseOrderNumber));
        Console.WriteLine(String.Format("Order Date: {0}",
            order.OrderDate.ToString()));
        Console.WriteLine("Order items:");
        foreach (SalesOrderDetail item in order.SalesOrderDetails)
        {
            Console.WriteLine(String.Format("Product: {0} "
                + "Quantity: {1}", item.ProductID.ToString(),
                item.OrderQty.ToString()));
        }
    }
}

L'exemple suivant utilise la méthode CreateSourceQuery sur l'objet EntityCollection pour charger uniquement cinq objets SalesOrderHeader, avec les objets SalesOrderDetail connexes, qui appartiennent à un même Contact. Ce résultat de requête est ensuite attaché à l'objet SalesOrderHeaderEntityCollection d'origine.

' Specify the customer ID. 
Dim customerId As Integer = 4332

Using context As New AdventureWorksEntities()
    ' Get a specified customer by contact ID. 
    Dim customer As Contact = context.Contacts.Where("it.ContactID = @customerId", _
                                                     New ObjectParameter("customerId", customerId)).First()

    ' Return the customer's first five orders with line items and 
    ' attach them to the SalesOrderHeader collection. 
    customer.SalesOrderHeaders.Attach(customer.SalesOrderHeaders.CreateSourceQuery().Include("SalesOrderDetails").Take(5))

    For Each order As SalesOrderHeader In customer.SalesOrderHeaders
        Console.WriteLine(String.Format("PO Number: {0}", order.PurchaseOrderNumber))
        Console.WriteLine(String.Format("Order Date: {0}", order.OrderDate.ToString()))
        Console.WriteLine("Order items:")

        For Each item As SalesOrderDetail In order.SalesOrderDetails
            Console.WriteLine(String.Format("Product: {0} Quantity: {1}", _
                                              item.ProductID.ToString(), item.OrderQty.ToString()))
        Next
    Next
End Using
// Specify the customer ID.
int customerId = 4332;

using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    // Get a specified customer by contact ID.
    Contact customer = context.Contacts
        .Where("it.ContactID = @customerId",
        new ObjectParameter("customerId", customerId)).First();

    // Return the customer's first five orders with line items and
    // attach them to the SalesOrderHeader collection.
    customer.SalesOrderHeaders.Attach(
        customer.SalesOrderHeaders.CreateSourceQuery()
        .Include("SalesOrderDetails").Take(5));

    foreach (SalesOrderHeader order in customer.SalesOrderHeaders)
    {
        Console.WriteLine(String.Format("PO Number: {0}",
            order.PurchaseOrderNumber));
        Console.WriteLine(String.Format("Order Date: {0}",
            order.OrderDate.ToString()));
        Console.WriteLine("Order items:");

        foreach (SalesOrderDetail item in order.SalesOrderDetails)
        {
            Console.WriteLine(String.Format("Product: {0} "
                + "Quantity: {1}", item.ProductID.ToString(),
                item.OrderQty.ToString()));
        }
    }
}

Voir aussi

Tâches

Procédure : exécuter une requête qui retourne des objets de type d'entité (Entity Framework)
Procédure : utiliser des chemins d'accès de requête pour personnaliser des résultats (Entity Framework)
Procédure : explorer des relations à l'aide des propriétés de navigation (Entity Framework)

Concepts

Chargement d'objets connexes (Entity Framework)