Freigeben über


Navigationseigenschaften

Die Navigationseigenschaften im Entitätsdatenmodell sind Verknüpfungseigenschaften für die Suche nach Entitäten an den Enden einer Zuordnung. Navigationseigenschaften ermöglichen das Navigieren zwischen Entitäten bzw. zwischen einer Entität und verknüpften Entitäten mithilfe eines Zuordnungssatzes. Navigationseigenschaften können sowohl in Entity SQL-Abfragen als auch in LINQ-to-Entities-Abfragen verwendet werden. Sie ermöglichen den Zugriff auf verknüpfte Entitäten, ohne eine JOIN-Operation ausführen zu müssen. Weitere Informationen finden Sie unter Navigationseigenschaften (EDM).

Im folgenden Beispiel mit methodenbasierter Abfragesyntax wird die SelectMany-Methode verwendet, um alle Aufträge von Kontakten mit dem Nachnamen "Zhou" abzurufen. Mit der Contact.SalesOrderHeader-Navigationseigenschaft wird eine Auflistung der SalesOrderHeader-Objekte für jeden Kontakt abgerufen.

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

Navigationseigenschaften stehen auch für Entitätsinstanzen in der CLR zur Verfügung, sodass verknüpfte Entitäten durch einen Aufruf der Load-Methode geladen werden können. Beim Laden einer Entität in der CLR sollten Sie Navigationseigenschaften explizit laden, bevor Sie auf deren Member zugreifen. Durch Laden dieser Eigenschaften können unbeabsichtigte Roundtrips zur Datenquelle vermieden werden. Da LINQ-to-Entities-Abfragen in der Datenquelle ausgewertet werden, sind keine weiteren Roundtrips erforderlich, und die Eigenschaft dient als Platzhalter für einen komplexeren Navigationsausdruck.

Sie können Navigationseigenschaften explizit innerhalb einer foreach/For Each-Schleife laden, wenn in der Verbindungszeichenfolge MultipleActiveResultSets=True festgelegt ist. Wenn die Verbindungszeichenfolge MultipleActiveResultSets=False enthält, gibt der Load-Methodenaufruf im folgenden Beispiel ein EntityCommandExecutionException aus.

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

Siehe auch

Konzepte

Beispiele für die methodenbasierte Abfragesyntax: Navigieren in Beziehungen (LINQ to Entities)
Ausdrücke in LINQ to Entities-Abfragen