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)