Procédure : exécuter une requête qui retourne des collections imbriquées (EntityClient)
Cette rubrique fournit un exemple d'exécution d'une commande sur un modèle EDM (Entity Data Model) en utilisant EntityCommand, et de récupération des résultats de collections imbriquées en utilisant EntityDataReader.
Pour exécuter le code de cet exemple
Ajoutez le modèle de vente AdventureWorks Sales Model à votre projet et configurez votre projet de façon à utiliser Entity Framework. Pour ce faire, effectuez l'une des opérations suivantes :
Si les outils Entity Data Model sont installés, exécutez la procédure décrite dans Procédure : utiliser l'Assistant Entity Data Model (Entity Framework).
Sinon, exécutez les procédures décrites dans Procédure : configurer manuellement un projet Entity Framework et Procédure : définir manuellement un modèle EDM (Entity Data Model) (Entity Framework).
Dans la page de codes de votre application, ajoutez les instructions using (Imports en Visual Basic) suivantes :
Imports System Imports System.Collections.Generic Imports System.Collections Imports System.Data.Common Imports System.Data Imports System.Data.SqlClient Imports System.Data.EntityClient Imports System.Data.Metadata.Edm Imports System.IO ' Add AdventureWorksModel prepended with the root namespace for the project. 'Imports ProjectName.AdventureWorksModel
using System; using System.Collections.Generic; using System.Collections; using System.Data.Common; using System.Data; using System.IO; using System.Data.SqlClient; using System.Data.EntityClient; using AdventureWorksModel; using System.Data.Metadata.Edm;
Exemple
Une collection imbriquée est une collection située à l'intérieure d'une autre collection. Le code suivant récupère une collection de Contacts et des collections imbriquées de SalesOrderHeaders associées à chaque Contact.
Using conn As EntityConnection = New EntityConnection("name=AdventureWorksEntities")
conn.Open()
Try
' Create an EntityCommand.
Using cmd As EntityCommand = conn.CreateCommand()
' Create a nested query.
Dim esqlQuery As String = "Select c.ContactID, c.SalesOrderHeader " & _
"From AdventureWorksEntities.Contact as c"
cmd.CommandText = esqlQuery
' Execute the command.
Using rdr As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
' The result returned by this query contains
' ContactID and a nested collection of SalesOrderHeader items.
' associated with this Contact.
Do While rdr.Read
' the first column contains Contact ID.
Console.WriteLine("Contact ID: {0}", rdr.Item("ContactID"))
' The second column contains a collection of SalesOrderHeader
' items associated with the Contact.
Dim nestedReader As DbDataReader = rdr.GetDataReader(1)
Do While nestedReader.Read
Console.WriteLine(" SalesOrderID: {0} ", nestedReader.Item("SalesOrderID"))
Console.WriteLine(" OrderDate: {0} ", nestedReader.Item("OrderDate"))
Loop
Loop
End Using
End Using
Catch ex As EntityException
Console.WriteLine(ex.ToString())
End Try
conn.Close()
End Using
using (EntityConnection conn =
new EntityConnection("name=AdventureWorksEntities"))
{
conn.Open();
try
{
// Create an EntityCommand.
using (EntityCommand cmd = conn.CreateCommand())
{
// Create a nested query.
string esqlQuery =
@"Select c.ContactID, c.SalesOrderHeader
From AdventureWorksEntities.Contact as c";
cmd.CommandText = esqlQuery;
// Execute the command.
using (EntityDataReader rdr =
cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
// The result returned by this query contains
// ContactID and a nested collection of SalesOrderHeader items.
// associated with this Contact.
while (rdr.Read())
{
// the first column contains Contact ID.
Console.WriteLine("Contact ID: {0}", rdr["ContactID"]);
// The second column contains a collection of SalesOrderHeader
// items associated with the Contact.
DbDataReader nestedReader = rdr.GetDataReader(1);
while (nestedReader.Read())
{
Console.WriteLine(" SalesOrderID: {0} ", nestedReader["SalesOrderID"]);
Console.WriteLine(" OrderDate: {0} ", nestedReader["OrderDate"]);
}
}
}
}
}
catch (EntityException ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
}