Gewusst wie : Explizites Laden verbundener Objekte (Entity Framework)

In diesem Thema wird anhand von Beispielen gezeigt, wie verbundene Objekte explizit geladen werden können.

Im ersten Beispiel wird die Load-Methode auf die EntityCollection angewendet, um explizit alle Bestellungen und Elemente für einen einzelnen Kunden zu laden. Die Load-Methode kann nicht mit POCO-Entitäten verwendet werden, da die Navigationseigenschaften von POCO-Entitäten nicht zur Rückgabe von EntityCollection erforderlich sind. Weitere Informationen finden Sie unter Laden von verknüpften POCO-Objekten (Entity Framework).

Im zweiten Beispiel wird die CreateSourceQuery-Methode verwendet, um eine Abfrage zu erstellen, die nur ausgewählte Bestellungen mit den verwandten Elementen lädt. Diese Bestellungen werden dann an den Kunden angefügt.

Sie können zum Laden von verknüpften Objekten auch die LoadProperty-Methode der ObjectContext-Klasse verwenden. Die LoadProperty-Methode kann mit POCO-Entitäten und mit von EntityObject abgeleiteten Entitäten verwendet werden.

Die Beispiele in diesem Thema beruhen auf dem AdventureWorks Sales-Modell. Weitere Informationen finden Sie unter Gewusst wie: Verwenden des Entity Data Model-Assistenten (Entity Framework).

Beispiel

Im folgenden Beispiel werden SalesOrderHeader-Objekte, die zu einem Contact gehören, geladen und dann werden die SalesOrderHeader-Objekte in der EntityCollection-Auflistung durchlaufen. Für jedes SalesOrderHeader-Objekt in der Auflistung wird Load aufgerufen, um die Auflistung verbundener SalesOrderDetail-Objekte von der Datenbank abzurufen.

' Specify the customer ID. 
Dim contactID As Integer = 4332

Using context As New AdventureWorksEntities()
    context.ContextOptions.LazyLoadingEnabled = False

    ' Get a specified customer by contact ID. 
    Dim contact = (From c In context.Contacts
        Where c.ContactID = contactID
        Select c).First()

    ' Load the orders for the customer explicitly. 
    If Not contact.SalesOrderHeaders.IsLoaded Then
        contact.SalesOrderHeaders.Load()
    End If

    For Each order As SalesOrderHeader In contact.SalesOrderHeaders
        ' Load the items for the order if not already loaded. 
        If Not order.SalesOrderDetails.IsLoaded Then
            order.SalesOrderDetails.Load()
        End If

        Console.WriteLine(String.Format("PO Number: {0}", order.PurchaseOrderNumber))
        Console.WriteLine(String.Format("Order Date: {0}", order.OrderDate.ToString()))
        Console.WriteLine("Order items:")
        For Each item As SalesOrderDetail In order.SalesOrderDetails
            Console.WriteLine(String.Format("Product: {0} Quantity: {1}", _
                                              item.ProductID.ToString(), item.OrderQty.ToString()))
        Next
    Next
End Using
// Specify the customer ID.
int contactID = 4332;

using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    context.ContextOptions.LazyLoadingEnabled = false;

    // Get a specified customer by contact ID.
    var contact =
        (from c in context.Contacts
         where c.ContactID == contactID
         select c).First();

    // Load the orders for the customer explicitly.
    if (!contact.SalesOrderHeaders.IsLoaded)
    {
        contact.SalesOrderHeaders.Load();
    }

    foreach (SalesOrderHeader order in contact.SalesOrderHeaders)
    {
        // Load the items for the order if not already loaded.
        if (!order.SalesOrderDetails.IsLoaded)
        {
            order.SalesOrderDetails.Load();
        }

        Console.WriteLine(String.Format("PO Number: {0}",
            order.PurchaseOrderNumber));
        Console.WriteLine(String.Format("Order Date: {0}",
            order.OrderDate.ToString()));
        Console.WriteLine("Order items:");
        foreach (SalesOrderDetail item in order.SalesOrderDetails)
        {
            Console.WriteLine(String.Format("Product: {0} "
                + "Quantity: {1}", item.ProductID.ToString(),
                item.OrderQty.ToString()));
        }
    }
}

Im folgenden Beispiel wird die CreateSourceQuery-Methode für die EntityCollection-Auflistung verwendet, um nur fünf SalesOrderHeader-Objekte zusammen mit verwandten SalesOrderDetail-Objekten zu laden, die zu einem einzelnen Contact gehören. Dieses Abfrageergebnis wird dann an die ursprüngliche SalesOrderHeader EntityCollection-Auflistung angefügt.

' Specify the customer ID. 
Dim customerId As Integer = 4332

Using context As New AdventureWorksEntities()
    ' Get a specified customer by contact ID. 
    Dim customer As Contact = context.Contacts.Where("it.ContactID = @customerId", _
                                                     New ObjectParameter("customerId", customerId)).First()

    ' Return the customer's first five orders with line items and 
    ' attach them to the SalesOrderHeader collection. 
    customer.SalesOrderHeaders.Attach(customer.SalesOrderHeaders.CreateSourceQuery().Include("SalesOrderDetails").Take(5))

    For Each order As SalesOrderHeader In customer.SalesOrderHeaders
        Console.WriteLine(String.Format("PO Number: {0}", order.PurchaseOrderNumber))
        Console.WriteLine(String.Format("Order Date: {0}", order.OrderDate.ToString()))
        Console.WriteLine("Order items:")

        For Each item As SalesOrderDetail In order.SalesOrderDetails
            Console.WriteLine(String.Format("Product: {0} Quantity: {1}", _
                                              item.ProductID.ToString(), item.OrderQty.ToString()))
        Next
    Next
End Using
// Specify the customer ID.
int customerId = 4332;

using (AdventureWorksEntities context =
    new AdventureWorksEntities())
{
    // Get a specified customer by contact ID.
    Contact customer = context.Contacts
        .Where("it.ContactID = @customerId",
        new ObjectParameter("customerId", customerId)).First();

    // Return the customer's first five orders with line items and
    // attach them to the SalesOrderHeader collection.
    customer.SalesOrderHeaders.Attach(
        customer.SalesOrderHeaders.CreateSourceQuery()
        .Include("SalesOrderDetails").Take(5));

    foreach (SalesOrderHeader order in customer.SalesOrderHeaders)
    {
        Console.WriteLine(String.Format("PO Number: {0}",
            order.PurchaseOrderNumber));
        Console.WriteLine(String.Format("Order Date: {0}",
            order.OrderDate.ToString()));
        Console.WriteLine("Order items:");

        foreach (SalesOrderDetail item in order.SalesOrderDetails)
        {
            Console.WriteLine(String.Format("Product: {0} "
                + "Quantity: {1}", item.ProductID.ToString(),
                item.OrderQty.ToString()));
        }
    }
}

Siehe auch

Aufgaben

Gewusst wie: Ausführen einer Abfrage, die Entitätstypobjekte zurückgibt (Entity Framework)
Gewusst wie: Bestimmen von Ergebnissen mit Abfragepfaden (Entity Framework)
Gewusst wie: Navigieren in Beziehungen mithilfe von Navigationseigenschaften (Entitiy Framework)

Konzepte

Laden von verknüpften Objekten (Entity Framework)