Proprietà di navigazione

Le proprietà di navigazione in Entity Data Model sono proprietà di collegamento utilizzate per individuare le entità finali di un'associazione. Le proprietà di navigazione consentono a un utente di spostarsi da un'entità a un'altra o da un entità alle entità correlate tramite un set di associazioni. Le proprietà di navigazione possono essere utilizzate nelle query Entity SQL e nelle query LINQ to Entities e consentono all'utente di accedere alle entità correlate senza dovere eseguire un'operazione JOIN. Per ulteriori informazioni, vedere Proprietà di navigazione (EDM).

Nell'esempio seguente nella sintassi delle query basate su metodo viene utilizzato il metodo SelectMany per recuperare tutti gli ordini dei contatti il cui cognome è "Zhou." La proprietà di navigazione Contact.SalesOrderHeader viene utilizzata per ottenere l'insieme di oggetti SalesOrderHeader per ciascun contatto.

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);
    }
}

Le proprietà di navigazione sono presenti anche nelle istanze delle entità in CLR, per consentire il caricamento delle entità correlate mediante la chiamata al metodo Load. Quando si carica un'entità in CLR, è necessario caricare in modo esplicito le proprietà di navigazione prima di accedere ai membri dell'entità. Il caricamento di tali proprietà consente di evitare i round trip imprevisti all'origine dati. Le query LINQ to Entities vengono tuttavia valutate nell'origine dati, pertanto non sono necessari round trip aggiuntivi e la proprietà agisce come segnaposto per un'espressione di navigazione più complessa.

È possibile caricare in modo esplicito le proprietà di navigazione di un ciclo foreach/For Each se nella stringa di connessione è contenuta l'impostazione MultipleActiveResultSets=True. Se la stringa di connessione contiene MultipleActiveResultSets=False, la chiamata al metodo Load nell'esempio seguente genererà un'eccezione 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);
    }
}

Vedere anche

Concetti

Esempi di sintassi delle query basate su metodo: spostamento tra relazioni (LINQ to Entities)
Espressioni nelle query LINQ to Entities