Propriétés de navigation
Les propriétés de navigation du modèle EDM (Modèle de données d'entité) sont des propriétés de raccourci utilisées pour localiser les entités situées aux terminaisons d'une association. Les propriétés de navigation vous permettent de naviguer d'une entité à une autre ou d'une entité à des entités associées par le biais d'un ensemble d'associations. Les propriétés de navigation peuvent être utilisées dans les requêtes Entité SQL, aussi bien que dans les requêtes LINQ to Entities. Vous pouvez ainsi accéder aux entités associées sans avoir à effectuer une opération JOIN. Pour plus d'informations, voir Propriétés de navigation (EDM).
L'exemple suivant de syntaxe de requête fondée sur une méthode utilise la méthode SelectMany pour obtenir toutes les commandes des contacts dont le nom de famille est « Zhou ». La propriété de navigation Contact.SalesOrderHeader est utilisée pour obtenir la collection des objets SalesOrderHeader de chaque contact.
Using AWEntities As New AdventureWorksEntities
Dim ordersQuery = AWEntities.Contact _
.Where(Function(c) c.LastName = "Zhou") _
.SelectMany(Function(o) o.SalesOrderHeader)
For Each order In ordersQuery
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}", _
order.SalesOrderID, order.OrderDate, order.TotalDue)
Next
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
IQueryable<SalesOrderHeader> ordersQuery = AWEntities.Contact
.Where(c => c.LastName == "Zhou")
.SelectMany(c => c.SalesOrderHeader);
foreach (var order in ordersQuery)
{
Console.WriteLine("Order ID: {0}, Order date: {1}, Total Due: {2}",
order.SalesOrderID, order.OrderDate, order.TotalDue);
}
}
Les propriétés de navigation apparaissent également dans les instances des entités figurant dans le CLR, ce qui vous permet de charger les entités associées en appelant la méthode Load. Lorsque vous chargez une entité dans le CLR, vous devez charger explicitement des propriétés de navigation avant d'accéder aux membres de l'entité. Le chargement de ces propriétés évite les allers-retours inattendus avec la source de données. Les requêtes LINQ to Entities sont toutefois évaluées dans la source de données afin qu'aucune boucle supplémentaire ne soit nécessaire et que la propriété joue le rôle d'espace réservé pour une expression de navigation plus complexe.
Vous pouvez charger explicitement des propriétés de navigation dans une boucle foreach/For Each si MultipleActiveResultSets=True est défini dans la chaîne de connexion. Si la chaîne de connexion contient MultipleActiveResultSets=False, l'appel de la méthode Load dans l'exemple suivant lève un EntityCommandExecutionException.
Using AWEntities As New AdventureWorksEntities()
Dim contacts = _
AWEntities.Contact _
.Where(Function(c) c.LastName = "Johnson") _
.Select(Function(c) c)
Try
For Each contact As Contact In contacts
Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName)
' Throws a EntityCommandExecutionException if
' MultipleActiveResultSets is set to False in the
' connection string.
contact.SalesOrderHeader.Load()
For Each order As SalesOrderHeader In contact.SalesOrderHeader
Console.WriteLine("Order ID: {0}", order.SalesOrderID)
Next
Next
Catch ex As EntityCommandExecutionException
Console.WriteLine(ex.InnerException)
End Try
End Using
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
IQueryable<Contact> contacts =
AWEntities.Contact
.Where(c => c.LastName == "Johnson")
.Select(c => c);
try
{
foreach (Contact contact in contacts)
{
Console.WriteLine("Name: {0}, {1}", contact.LastName, contact.FirstName);
// Throws a EntityCommandExecutionException if
// MultipleActiveResultSets is set to False in the
// connection string.
contact.SalesOrderHeader.Load();
foreach (SalesOrderHeader order in contact.SalesOrderHeader)
{
Console.WriteLine("Order ID: {0}", order.SalesOrderID);
}
}
}
catch (EntityCommandExecutionException ex)
{
Console.WriteLine(ex.InnerException);
}
}
Voir aussi
Concepts
Exemples de syntaxe de requête fondée sur une méthode : exploration de relations (LINQ to Entities)
Expressions dans les requêtes LINQ to Entities