Procédure : interroger les objets connexes d'un EntityCollection (Entity Framework)
Cette rubrique fournit des exemples d'interrogation des objets connexes d'un objet EntityCollection retourné par la propriété de navigation de la relation.
L'exemple de cette rubrique est basé sur le modèle de vente Adventure Works Sales Model. Pour exécuter le code de cet exemple, vous devez déjà avoir ajouté le modèle de vente AdventureWorks Sales Model à votre projet et configuré ce dernier pour qu'il utilise Entity Framework. Pour ce faire, exécutez les procédures décrites dans Procédure : configurer manuellement un projet Entity Framework et Procédure : définir manuellement un modèle EDM (Entity Data Model) (Entity Framework). Vous pouvez également définir le modèle de vente AdventureWorks Sales Model à l'aide de l'Assistant EDM. Pour plus d'informations, voir Procédure : utiliser l'Assistant Entity Data Model (Entity Framework).
Exemple
Cet exemple charge la collection d'objets SalesOrderHeader relatifs à un contact spécifique, puis utilise une expression LINQ pour retourner une liste de commandes passées en ligne et déjà expédiées.
' Specify the customer ID.
Dim customerId As Integer = 4332
Using context As AdventureWorksEntities = _
New AdventureWorksEntities()
Try
' Get a specified customer by contact ID.
Dim customer = (From customers In context.Contact _
Where customers.ContactID = customerId _
Select customers).First()
' Load the customer orders if not already loaded.
If Not customer.SalesOrderHeader.IsLoaded Then
customer.SalesOrderHeader.Load()
End If
' Write the number of orders for the customer.
Console.WriteLine("Customer '{0}' has placed {1} total orders.", _
customer.LastName, customer.SalesOrderHeader.Count)
' Get the online orders that have shipped.
Dim shippedOrders = _
From order In customer.SalesOrderHeader _
Where order.OnlineOrderFlag = True _
And order.Status = 5 _
Select order
' Write the number of orders placed online.
Console.WriteLine("{0} orders placed online have been shipped.", _
shippedOrders.Count())
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
End Try
End Using
// Specify the customer ID.
int customerId = 4332;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
try
{
// Get a specified customer by contact ID.
var customer = (from customers in context.Contact
where customers.ContactID == customerId
select customers).First();
// Load the customer orders if not already loaded.
if (!customer.SalesOrderHeader.IsLoaded)
{
customer.SalesOrderHeader.Load();
}
// Write the number of orders for the customer.
Console.WriteLine("Customer '{0}' has placed {1} total orders.",
customer.LastName, customer.SalesOrderHeader.Count);
// Get the online orders that have shipped.
var shippedOrders =
from order in customer.SalesOrderHeader
where order.OnlineOrderFlag == true
&& order.Status == 5
select order;
// Write the number of orders placed online.
Console.WriteLine("{0} orders placed online have been shipped.",
shippedOrders.Count());
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
}
Cet exemple utilise la même requête LINQ que le premier exemple sur la collection d'objets SalesOrderHeader. Au lieu de commencer par charger tous les objets connexes dans la collection, la méthode CreateSourceQuery est utilisée pour charger uniquement les objets retournés par la requête. La méthode Load est ensuite appelée sur l'objet EntityCollection retourné par la propriété de navigation de la relation SalesOrderHeader pour charger les objets connexes restants.
' Specify the customer ID.
Dim customerId As Integer = 4332
Using context As AdventureWorksEntities = _
New AdventureWorksEntities()
Try
' Get a specified customer by contact ID.
Dim customer = (From customers In context.Contact _
Where customers.ContactID = customerId _
Select customers).First()
' Use CreateSourceQuery to generate a query that returns
' only the online orders that have shipped.
Dim shippedOrders = _
From orders In customer.SalesOrderHeader.CreateSourceQuery() _
Where orders.OnlineOrderFlag = True _
And orders.Status = 5 _
Select orders
' Write the number of orders placed online.
Console.WriteLine("{0} orders placed online have been shipped.", _
shippedOrders.Count())
' Load the remaining orders for this customer.
If Not customer.SalesOrderHeader.IsLoaded Then
customer.SalesOrderHeader.Load()
End If
' Write the number of total orders for the customer.
Console.WriteLine("Customer '{0}' has placed {1} total orders.", _
customer.LastName, customer.SalesOrderHeader.Count)
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
End Try
End Using
// Specify the customer ID.
int customerId = 4332;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
try
{
// Get a specified customer by contact ID.
var customer = (from customers in context.Contact
where customers.ContactID == customerId
select customers).First();
// Use CreateSourceQuery to generate a query that returns
// only the online orders that have shipped.
var shippedOrders =
from orders in customer.SalesOrderHeader.CreateSourceQuery()
where orders.OnlineOrderFlag == true
&& orders.Status == 5
select orders;
// Write the number of orders placed online.
Console.WriteLine("{0} orders placed online have been shipped.",
shippedOrders.Count());
// Load the remaining orders for this customer.
if (!customer.SalesOrderHeader.IsLoaded)
{
customer.SalesOrderHeader.Load();
}
// Write the number of total orders for the customer.
Console.WriteLine("Customer '{0}' has placed {1} total orders.",
customer.LastName, customer.SalesOrderHeader.Count);
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
}
Voir aussi
Tâches
Procédure : exécuter une requête qui retourne un 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)