Share via


Procedura: caricare in modo esplicito oggetti correlati (Entity Framework)

In questo argomento sono contenuti esempi di caricamento esplicito di oggetti correlati.

Nel primo esempio viene utilizzato il metodo Load su EntityCollection per caricare in modo esplicito tutti gli ordini e gli elementi relativi a un singolo cliente. Non è possibile utilizzare il metodo Load con entità POCO in quanto le proprietà di navigazione delle entità POCO non devono restituire EntityCollection. Per ulteriori informazioni, vedere Caricamento di entità POCO correlate (Entity Framework).

Nel secondo esempio viene utilizzato il metodo CreateSourceQuery per creare una query che carica solo gli ordini selezionati con gli elementi correlati. Tali ordini vengono quindi collegati al cliente.

Per caricare oggetti correlati, è anche possibile utilizzare il metodo LoadProperty della classe ObjectContext. Il metodo LoadProperty può essere utilizzato con entità POCO e con entità derivate da EntityObject.

Gli esempi inclusi in questo argomento sono basati sul modello Sales di AdventureWorks. Per ulteriori informazioni, vedere Procedura: utilizzare la procedura guidata Entity Data Model (Entity Framework).

Esempio

Nell'esempio seguente vengono caricati gli oggetti SalesOrderHeader che appartengono a un singolo oggetto Contact e vengono quindi scorsi gli oggetti SalesOrderHeader in EntityCollection. Su ogni oggetto SalesOrderHeader della raccolta, viene chiamato il metodo Load per recuperare la raccolta di oggetti SalesOrderDetail correlati dal database.

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

Nell'esempio seguente viene utilizzato il metodo CreateSourceQuery sull'oggetto EntityCollection per caricare solo cinque oggetti SalesOrderHeader, con gli oggetti correlato SalesOrderDetail, che appartengono a un singolo Contact. Il risultato della query viene quindi connesso all'oggetto SalesOrderHeader EntityCollection originale.

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

Vedere anche

Attività

Procedura: eseguire una query che restituisce oggetti di tipo entità (Entity Framework)
Procedura: utilizzare percorsi di query per influenzare i risultati (Entity Framework)
Procedura: spostarsi nelle relazioni utilizzando le proprietà di navigazione (Entity Framework)

Concetti

Caricamento di oggetti correlati (Entity Framework)