Partager via


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