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

  1. 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.

  2. 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
    
    
  3. 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 e Phone do tipo de entidade Contact e clique com o botão direito do mouse e escolha Refatorar no Novo Tipo Complexo.

  4. Um novo tipo complexo com as propriedades Email e Phone selecionadas é adicionado a Pesquisador de Modelos. O tipo complexo recebe um nome padrão: renomeie o tipo como EmailPhone na janela Propriedades. Além disso, uma nova propriedade de ComplexProperty é adicionada ao tipo de entidade de Contact . Renomear a propriedade a EmailPhoneComplexType.

    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