Как явно загружать связанные объекты (платформа Entity Framework)

В этом разделе приведены примеры явной загрузки связанных объектов.

В первом примере используется метод Load для коллекции EntityCollection для явной загрузки всех заказов и товарных позиций, относящихся к одному заказчику. Метод Load нельзя использовать с сущностями POCO, поскольку для возврата EntityCollection свойства навигации сущностей POCO не требуются. Дополнительные сведения см. в разделе Загрузка связанных сущностей POCO (платформа Entity Framework).

Во втором примере для создания запроса, который загружает только выбранные заказы с относящимися к ним товарными позициями, используется метод CreateSourceQuery. Затем эти заказы прикрепляются к клиенту.

Для загрузки требуемых объектов также можно использовать метод LoadProperty класса ObjectContext. Метод LoadProperty может использоваться с сущностями POCO и с сущностями, производными от EntityObject.

Примеры в этом разделе основаны на модели Adventure Works Sales Model. Дополнительные сведения см. в разделе Как использовать мастер моделей EDM (платформа Entity Framework).

Пример

В следующем примере выполняется загрузка объектов SalesOrderHeader, принадлежащих одному элементу Contact, а затем выполняется просмотр объектов SalesOrderHeader в коллекции EntityCollection. Для каждого из объектов SalesOrderHeader в этой коллекции вызывается метод Load для получения коллекции связанных объектов SalesOrderDetail из базы данных.

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

В следующем примере метод CreateSourceQuery применяется к EntityCollection для загрузки пяти объектов SalesOrderHeader со связанными объектами SalesOrderDetail, принадлежащих одному элементу Contact. Результат этого запроса прикрепляется к исходной коллекции SalesOrderHeader EntityCollection.

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

См. также

Задачи

Как выполнить запрос, возвращающий объекты типа сущностей (платформа Entity Framework)
Как использовать пути запросов для формирования результатов (платформа Entity Framework)
Как переходить по связям с помощью свойств навигации (платформа Entity Framework)

Основные понятия

Загрузка связанных объектов (платформа Entity Framework)