入れ子になったコレクションを返すクエリを実行する方法 (EntityClient)

ここでは、EntityCommand オブジェクトを使用して概念モデルに対してコマンドを実行する方法、および EntityDataReader を使用して入れ子になったコレクションの結果を取得する方法について説明します。

この例のコードを実行するには

  1. Add the AdventureWorks Sales Model to your project and configure your project to use the Entity Framework . 詳細については、「Entity Data Model ウィザードを使用する方法 (Entity Framework)」を参照してください。

  2. アプリケーションのコード ページで、次の using ステートメント (Visual Basic の場合は Imports) を追加します。

    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;
    

入れ子になったコレクションとは、別のコレクションに含まれているコレクションのことです。 次に示すコードでは、Contact のコレクションと、それぞれの Contact に関連付けられている、SalesOrderHeader の入れ子になったコレクションを取得します。

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

参照

概念

Entity Framework 用の EntityClient プロバイダー