Procédure : Exécuter une requête qui retourne des types complexes
Cette rubrique indique comment exécuter une requête Entity SQL qui retourne des objets de type d’entité qui contiennent une propriété d’un type complexe.
Pour exécuter le code de cet exemple
Ajoutez le modèle de vente AdventureWorks Sales Model à votre projet et configurez ce dernier de façon à utiliser Entity Framework. Pour plus d’informations, consultez Comment : Utiliser l’Assistant Entity Data Model.
Dans la page de codes de votre application, ajoutez les directives
using
(Imports
dans Visual Basic) suivantes :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 System.Data.Metadata.Edm;
Imports System.Collections.Generic Imports System.Collections Imports System.Data.Common Imports System.Data Imports System.IO Imports System.Data.SqlClient Imports System.Data.EntityClient Imports System.Data.Metadata.Edm
Double-cliquez sur le fichier .edmx pour afficher le modèle dans la fenêtre Explorateur de modèles du Concepteur d’entités. Sur l’aire du Concepteur d’entités, sélectionnez les propriétés
Email
etPhone
du type d’entitéContact
, puis cliquez avec le bouton droit et sélectionnez Refactoriser en nouveau type complexe.Un nouveau type complexe avec les propriétés
Email
etPhone
sélectionnées est ajouté à l’Explorateur de modèles. Le type complexe reçoit un nom par défaut : renommez le type enEmailPhone
dans la fenêtre Propriétés. Une nouvelle propriétéComplexProperty
est également ajoutée au type d'entitéContact
. Renommez la propriété enEmailPhoneComplexType.
.Pour plus d’informations sur la création et la modification de types complexes avec l’Assistant EDM, consultez Procédure : refactoriser des propriétés existantes en propriété de type complexe et Procédure : créer et modifier des types complexes.
Exemple
L’exemple suivant exécute une requête qui retourne une collection d’objets Contact
et affiche deux propriétés des objets Contact
: ContactID
et les valeurs du type complexe EmailPhoneComplexType
.
using (EntityConnection conn =
new EntityConnection("name=AdventureWorksEntities"))
{
conn.Open();
string esqlQuery = @"SELECT VALUE contacts FROM
AdventureWorksEntities.Contacts AS contacts
WHERE contacts.ContactID == @id";
// Create an EntityCommand.
using (EntityCommand cmd = conn.CreateCommand())
{
cmd.CommandText = esqlQuery;
EntityParameter param = new EntityParameter();
param.ParameterName = "id";
param.Value = 3;
cmd.Parameters.Add(param);
// Execute the command.
using (EntityDataReader rdr =
cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
// The result returned by this query contains
// Address complex Types.
while (rdr.Read())
{
// Display CustomerID
Console.WriteLine("Contact ID: {0}",
rdr["ContactID"]);
// Display Address information.
DbDataRecord nestedRecord =
rdr["EmailPhoneComplexProperty"] as DbDataRecord;
Console.WriteLine("Email and Phone Info:");
for (int i = 0; i < nestedRecord.FieldCount; i++)
{
Console.WriteLine(" " + nestedRecord.GetName(i) +
": " + nestedRecord.GetValue(i));
}
}
}
}
conn.Close();
}
Using conn As New EntityConnection("name=AdventureWorksEntities")
conn.Open()
Dim esqlQuery As String = "SELECT VALUE contacts FROM" & _
" AdventureWorksEntities.Contacts AS contacts WHERE contacts.ContactID == @id"
' Create an EntityCommand.
Using cmd As EntityCommand = conn.CreateCommand()
cmd.CommandText = esqlQuery
Dim param As New EntityParameter()
param.ParameterName = "id"
param.Value = 3
cmd.Parameters.Add(param)
' Execute the command.
Using rdr As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
' The result returned by this query contains
' Address complex Types.
While rdr.Read()
' Display CustomerID
Console.WriteLine("Contact ID: {0}", rdr("ContactID"))
' Display Address information.
Dim nestedRecord As DbDataRecord = TryCast(rdr("EmailPhoneComplexProperty"), DbDataRecord)
Console.WriteLine("Email and Phone Info:")
For i As Integer = 0 To nestedRecord.FieldCount - 1
Console.WriteLine((" " & nestedRecord.GetName(i) & ": ") + nestedRecord.GetValue(i))
Next
End While
End Using
End Using
conn.Close()
End Using