방법: 복합 형식을 반환하는 쿼리 실행

이 항목에서는 복합 형식의 속성이 포함된 엔터티 형식 개체를 반환하는 Entity SQL 쿼리를 실행하는 방법을 보여 줍니다.

이 예제의 코드를 실행하려면

  1. 프로젝트에 AdventureWorks Sales 모델을 추가하고 Entity Framework를 사용하도록 프로젝트를 구성합니다. 자세한 내용은 방법: 엔터티 데이터 모델 마법사 사용을 참조하세요.

  2. 애플리케이션의 코드 페이지에서 다음 using 문(Visual Basic에서는 Imports)을 추가합니다.

    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. .edmx 파일을 두 번 클릭하여 Entity Designer의 모델 브라우저 창에 모델을 표시합니다. Entity Designer 화면에서 Contact 엔터티 형식의 EmailPhone 속성을 선택한 다음, 마우스 오른쪽 단추를 클릭하고 새 복합 형식으로 리팩터링을 선택합니다.

  4. 선택한 EmailPhone 속성이 포함된 새 복합 형식이 모델 브라우저에 추가됩니다. 복합 형식에 기본 이름이 지정됩니다. 속성 창에서 형식의 이름을 EmailPhone으로 바꿉니다. 또한 새 ComplexProperty 속성이 Contact 엔터티 형식에 추가됩니다. 속성의 이름을 EmailPhoneComplexType.으로 바꿉니다.

    엔터티 데이터 모델 마법사를 사용하여 복합 형식을 만들고 수정하는 방법에 대한 자세한 내용은 방법: 기존 속성을 복합 형식 속성으로 리팩터링방법: 복합 형식 만들기 및 수정을 참조하세요.

예시

다음 예제에서는 Contact 개체의 컬렉션을 반환하고 Contact 개체(ContactID)의 두 속성인 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