Compartir a través de


Cómo: Ejecutar una consulta que devuelve tipos complejos (EntityClient)

En este tema se muestra cómo ejecutar una consulta Entity SQL que devuelve objetos de tipo entidad que contienen una propiedad de un tipo complejo.

Para ejecutar el código de este ejemplo

  1. Agregue el Modelo AdventureWorks Sales al proyecto y configúrelo para usar Entity Framework . Para obtener más información, vea Cómo usar el Asistente para Entity Data Model (Entity Framework).

  2. En la página de códigos de la aplicación, agregue las siguientes instrucciones using (Imports en Visual Basic):

    Imports System
    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
    
    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;
    
  3. Haga doble clic en el archivo .edmx para mostrar el modelo en la ventana del Explorador de modelos de Entity Designer. En la superficie de Entity Designer, seleccione las propiedades Email y Phone del tipo de entidad Contact y, a continuación, haga clic con el botón secundario del mouse y seleccione Refactorizar en un nuevo tipo complejo.

  4. Un nuevo tipo complejo con las propiedades Email y Phone seleccionadas se agrega al Explorador de modelos. El tipo complejo recibe un nombre predeterminado: cambie el nombre del tipo a EmailPhone en la ventana Propiedades. También se agrega una nueva propiedad ComplexProperty al tipo de entidad Contact. Cambie el nombre de la propiedad a EmailPhoneComplexType..

    Para obtener información sobre cómo crear y modificar tipos complejos utilizando el Asistente para Entity Data Model, vea How to: Refactor Existing Properties into a Complex Type Property (Entity Data Model Tools) y How to: Create and Modify Complex Types.

Ejemplo

En el siguiente ejemplo se ejecuta una consulta que devuelve una colección de objetos Contact y muestra dos propiedades de los objetos Contact : ContactID y los valores del tipo complejo EmailPhoneComplexType.

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
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();
}