Как явно загружать связанные объекты (платформа Entity Framework)
В этом разделе представлен пример того, как должна осуществляться явная загрузка связанных объектов. В первом примере явным образом осуществляется загрузка всех заказов и товарных позиций для одного клиента. Во втором примере используется отдельный запрос для загрузки только выбранных заказов с относящимися к ним товарными позициями. Затем эти заказы присоединяются к данным о заказчике.
Примеры в этом разделе основаны на модели Adventure Works Sales. Для запуска кода в этом примере необходимо добавить модель AdventureWorks Sales в проект и настроить проект для использования платформы Entity Framework. Для этого выполните инструкции из разделов Как вручную настроить проект Entity Framework и Как определить модель EDM вручную (платформа Entity Framework). Для определения модели AdventureWorks Sales можно также использовать мастер моделей EDM. Дополнительные сведения см. в разделе Как использовать мастер моделей EDM (платформа Entity Framework).
Примеры
В следующем примере загружаются объекты SalesOrderHeader, которые принадлежат к одному объекту Contact, а затем выполняются итерации по объектам SalesOrderHeader в EntityCollection. Применительно к каждому объекту SalesOrderHeader в этой коллекции вызывается метод Load для получения коллекции связанных объектов SalesOrderDetail из базы данных.
' Specify the customer ID.
Dim customerId As Integer = 4332
Using context As New AdventureWorksEntities
Try
' Get a specified customer by contact ID.
Dim customer As Contact = context.Contact _
.Where("it.ContactID = @customerId", _
New ObjectParameter("customerId", customerId)).First()
' Load the orders for the customer
If (Not customer.SalesOrderHeader.IsLoaded) Then
customer.SalesOrderHeader.Load()
End If
For Each order As SalesOrderHeader In customer.SalesOrderHeader
' Load the items for the order if not already loaded.
If Not order.SalesOrderDetail.IsLoaded Then
order.SalesOrderDetail.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:")
Dim item As SalesOrderDetail
For Each item In order.SalesOrderDetail
Console.WriteLine(String.Format("Product:{0}" _
+ "Quantity: {1}", item.ProductID.ToString(), _
item.OrderQty.ToString()))
Next
Next
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
Catch ex As EntityCommandExecutionException
Console.WriteLine(ex.ToString())
End Try
End Using
// Specify the customer ID.
int customerId = 4332;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
try
{
// Get a specified customer by contact ID.
Contact customer = context.Contact
.Where("it.ContactID = @customerId",
new ObjectParameter("customerId", customerId)).First();
// Load the orders for the customer
if (!customer.SalesOrderHeader.IsLoaded)
{
customer.SalesOrderHeader.Load();
}
foreach (SalesOrderHeader order in customer.SalesOrderHeader)
{
// Load the items for the order if not already loaded.
if (!order.SalesOrderDetail.IsLoaded)
{
order.SalesOrderDetail.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.SalesOrderDetail)
{
Console.WriteLine(String.Format("Product: {0} "
+ "Quantity: {1}", item.ProductID.ToString(),
item.OrderQty.ToString()));
}
}
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
catch (EntityCommandExecutionException ex)
{
Console.WriteLine(ex.ToString());
}
}
В следующем примере используется метод CreateSourceQuery применительно к EntityCollection для загрузки только пяти объектов SalesOrderHeader, которые связаны с объектом SalesOrderDetail, принадлежащим к одному объекту Contact. После этого результат запроса присоединяется к исходному значению SalesOrderHeader объекта EntityCollection.
' Specify the customer ID.
Dim customerId As Integer = 4332
Using context As New AdventureWorksEntities
Try
' Get a specified customer by contact ID.
Dim customer As Contact = context.Contact _
.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.SalesOrderHeader.Attach( _
customer.SalesOrderHeader.CreateSourceQuery() _
.Include("SalesOrderDetail").Take(5))
For Each order As SalesOrderHeader In customer.SalesOrderHeader
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.SalesOrderDetail
Console.WriteLine(String.Format("Product: {0} " _
+ "Quantity: {1}", item.ProductID.ToString(), _
item.OrderQty.ToString()))
Next
Next
Catch ex As EntitySqlException
Console.WriteLine(ex.ToString())
End Try
End Using
// Specify the customer ID.
int customerId = 4332;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
try
{
// Get a specified customer by contact ID.
Contact customer = context.Contact
.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.SalesOrderHeader.Attach(
customer.SalesOrderHeader.CreateSourceQuery()
.Include("SalesOrderDetail").Take(5));
foreach (SalesOrderHeader order in customer.SalesOrderHeader)
{
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.SalesOrderDetail)
{
Console.WriteLine(String.Format("Product: {0} "
+ "Quantity: {1}", item.ProductID.ToString(),
item.OrderQty.ToString()));
}
}
}
catch (EntitySqlException ex)
{
Console.WriteLine(ex.ToString());
}
}
См. также
Задачи
Как выполнить запрос, возвращающий тип сущности (платформа Entity Framework)
Как использовать пути запросов для формирования результатов (платформа Entity Framework)
Как переходить по связям с помощью свойств навигации (платформа Entity Framework)