方法: 複合型を返すクエリを実行する
このトピックでは、複合型プロパティを含むエンティティ型オブジェクトを返す Entity SQL クエリを実行する方法について説明します。
この例のコードを実行するには
AdventureWorks Sales Model をプロジェクトに追加し、Entity Framework が使用されるようにプロジェクトを構成します。 詳細については、Entity Data Model ウィザードを使用する」を参照してください。
アプリケーションのコード ページで、次の
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
.edmx ファイルをダブルクリックして、エンティティ デザイナーの [モデル ブラウザー] ウィンドウにモデルを表示します。 エンティティ デザイナー画面で、
Contact
エンティティ型のEmail
プロパティとPhone
プロパティを選択し、右クリックして [新しい複合型へのリファクター] を選択します。選択した
Email
プロパティとPhone
プロパティの新しい複合型がモデル ブラウザーに追加されます。 複合型には既定の名前が設定されます。 [プロパティ] ウィンドウで型の名前をEmailPhone
に変更します。 また、新しいComplexProperty
プロパティがContact
エンティティ型に追加されます。 プロパティの名前をEmailPhoneComplexType.
に変更します。Entity Data Model ウィザードを使用した複合型の作成と変更について詳しくは、「方法: 既存のプロパティを複合型プロパティにリファクタリングする」および「方法: 複合型を作成および変更する」をご覧ください。
例
次の例では、Contact
オブジェクトのコレクションを返し、Contact
オブジェクトの 2 つのプロパティである 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