Procedimiento para ejecutar una consulta que devuelve colecciones anidadas

Aquí se explica cómo ejecutar un comando en un modelo conceptual utilizando un objeto EntityCommand y cómo recuperar los resultados de la colección anidados utilizando EntityDataReader.

Para ejecutar el código de este ejemplo

  1. Agregue el modelo AdventureWorks Sales al proyecto y configure el proyecto para utilizar Entity Framework. Para más información, consulte Cómo: Usar el Asistente para Entity Data Model.

  2. En la página de código de la aplicación, agregue las instrucciones using siguientes (Imports en 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
    
    

Ejemplo

Una colección anidada es una colección contenida dentro de otra. En el código siguiente se recupera una colección de Contacts y las colecciones anidadas de SalesOrderHeaders asociadas a cada Contact.

using (EntityConnection conn =
    new EntityConnection("name=AdventureWorksEntities"))
{
    conn.Open();
    // Create an EntityCommand.
    using (EntityCommand cmd = conn.CreateCommand())
    {
        // Create a nested query.
        string esqlQuery =
            @"Select c.ContactID, c.SalesOrderHeaders
        From AdventureWorksEntities.Contacts 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"]);
                }
            }
        }
    }
    conn.Close();
}
Using conn As New EntityConnection("name=AdventureWorksEntities")
    conn.Open()
    ' Create an EntityCommand. 
    Using cmd As EntityCommand = conn.CreateCommand()
        ' Create a nested query. 
        Dim esqlQuery As String = "Select c.ContactID, c.SalesOrderHeaders" & _
            " From AdventureWorksEntities.Contacts 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. 
            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. 
                Dim nestedReader As DbDataReader = rdr.GetDataReader(1)
                While nestedReader.Read()
                    Console.WriteLine(" SalesOrderID: {0} ", nestedReader("SalesOrderID"))
                    Console.WriteLine(" OrderDate: {0} ", nestedReader("OrderDate"))
                End While
            End While
        End Using
    End Using
    conn.Close()
End Using

Consulte también