Como: executar uma consulta que retorna tipos complexos
Este tópico mostra como executar uma consulta Entity SQL que retorna os objetos do tipo de entidade que contêm uma propriedade de um tipo complexo.
Para executar o código nesse exemplo
Adicione o Modelo de Vendas do AdventureWorks ao projeto e configure o projeto para usar o Entity Framework. Para obter mais informações, confira Como usar o Assistente de Modelo de Dados de Entidade.
Na página de código do seu aplicativo, adicione as seguintes instruções
using
(Imports
no Visual Basic):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
Clique duas vezes no arquivo .edmx para exibir o modelo na janela do Navegador de Modelo do Entity Designer. Na superfície do Entity Designer, selecione as propriedades
Email
ePhone
do tipo de entidadeContact
e clique com o botão direito do mouse e escolha Refatorar no Novo Tipo Complexo.Um novo tipo complexo com as propriedades
Email
ePhone
selecionadas é adicionado a Pesquisador de Modelos. O tipo complexo recebe um nome padrão: renomeie o tipo comoEmailPhone
na janela Propriedades. Além disso, uma nova propriedade deComplexProperty
é adicionada ao tipo de entidade deContact
. Renomear a propriedade aEmailPhoneComplexType.
Para obter informações sobre como criar e modificar tipos complexos usando o Assistente de Modelo de Dados de Entidade, confira Como refatorar as propriedades existentes em uma propriedade de tipo complexo e Como criar e modificar tipos complexos.
Exemplo
O exemplo a seguir executa uma consulta que retorna uma coleção de objetos Contact
e exibe duas propriedades dos objetos Contact
: ContactID
e valores do tipo complexo 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