Как явно загружать связанные объекты (платформа 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)