次の方法で共有


複合型を返すクエリの実行方法 (EntityClient)

このトピックでは、複合型プロパティを含むエンティティ型オブジェクトを返す Entity SQL クエリを実行する方法について説明します。

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

  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;
    
  3. .edmx ファイルをダブルクリックして、エンティティ デザイナーの [モデル ブラウザー] ウィンドウにモデルを表示します。 エンティティ デザイナー画面で、Contact エンティティ型の Email プロパティと Phone プロパティを選択し、右クリックして [新しい複合型へのリファクター] を選択します。

  4. 選択した Email プロパティと Phone プロパティの新しい複合型がモデル ブラウザーに追加されます。 複合型には既定の名前が付きます。プロパティ ウィンドウで型の名前を EmailPhone に変更します。 また、新しい ComplexProperty プロパティが Contact エンティティ型に追加されます。 プロパティの名前を EmailPhoneComplexType に変更します。

    Entity Data Model ウィザードを使用した複合型の作成と変更の詳細については、「How to: Refactor Existing Properties into a Complex Type Property (Entity Data Model Tools)」および「How to: Create and Modify Complex Types」を参照してください。

次の例は、Contact オブジェクトのコレクションを返し、Contact オブジェクトの 2 つのプロパティとして ContactIDEmailPhoneComplexType 複合型の値を表示するクエリを実行します。

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