Procedura: caricare in modo esplicito oggetti correlati (Entity Framework)
In questo argomento sono contenuti esempi di caricamento esplicito di oggetti correlati. Nel primo esempio vengono caricati in modo esplicito tutti gli ordini e gli elementi relativi a un singolo cliente. Nel secondo esempio viene utilizzata una query separata per caricare solo gli ordini selezionati con gli elementi correlati. Tali ordini vengono quindi collegati al cliente.
Gli esempi inclusi in questo argomento si basano sul modello Sales di AdventureWorks. Per eseguire il codice incluso in questo argomento, è necessario avere già aggiunto il modello Sales di AdventureWorks al progetto e avere configurato il progetto per l'utilizzo di Entity Framework. A tale scopo, completare le procedure descritte in Procedura: configurare manualmente un progetto di Entity Framework e Procedura: definire manualmente un modello EDM (Entity Framework). È inoltre possibile utilizzare la procedura guidata Entity Data Model per definire il 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 dell'insieme, viene chiamato il metodo Load per recuperare l'insieme di oggetti SalesOrderDetail correlati dal database.
' 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());
}
}
Nell'esempio seguente viene utilizzato il metodo CreateSourceQuery su EntityCollection per caricare solo cinque oggetti SalesOrderHeader, con l'oggetto correlato SalesOrderDetail, che appartengono a un singolo Contact. Il risultato della query viene quindi collegato all'oggetto SalesOrderHeaderEntityCollection originale.
' 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());
}
}
Vedere anche
Attività
Procedura: eseguire una query che restituisce un tipo di 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
Determinazione della struttura dei risultati di query (Entity Framework)