方法: RefType 結果を返すクエリを実行する

このトピックでは、EntityCommand オブジェクトを使用して概念モデルに対してコマンドを実行する方法と、RefType を使用して EntityDataReader の結果を取得する方法を示します。

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

  1. AdventureWorks Sales Model をプロジェクトに追加し、Entity Framework が使用されるようにプロジェクトを構成します。 詳細については、Entity Data Model ウィザードを使用する」を参照してください。

  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
    
    

この例は、RefType の結果を返すクエリを実行します。 次のクエリを引数として ExecuteRefTypeQuery 関数に渡すと、関数はエンティティへの参照を返します。

SELECT REF(p) FROM AdventureWorksEntities.Products as p

パラメーター化されたクエリを渡す場合は、次のように、EntityParameter オブジェクトの Parameters プロパティに EntityCommand オブジェクトを追加します。

SELECT REF(p) FROM AdventureWorksEntities.Products as p WHERE p.ProductID == @productID
static public void ExecuteRefTypeQuery(string esqlQuery)
{
    if (esqlQuery.Length == 0)
    {
        Console.WriteLine("The query string is empty.");
        return;
    }

    using (EntityConnection conn =
        new EntityConnection("name=AdventureWorksEntities"))
    {
        conn.Open();

        // Create an EntityCommand.
        using (EntityCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = esqlQuery;
            // Execute the command.
            using (EntityDataReader rdr =
                cmd.ExecuteReader(CommandBehavior.SequentialAccess))
            {
                // Start reading results.
                while (rdr.Read())
                {
                    RefTypeVisitRecord(rdr as IExtendedDataRecord);
                }
            }
        }
        conn.Close();
    }
}

static void RefTypeVisitRecord(IExtendedDataRecord record)
{
    // For RefType the record contains exactly one field.
    int fieldIndex = 0;

    // If the field is flagged as DbNull, the shape of the value is undetermined.
    // An attempt to get such a value may trigger an exception.
    if (record.IsDBNull(fieldIndex) == false)
    {
        BuiltInTypeKind fieldTypeKind = record.DataRecordInfo.FieldMetadata[fieldIndex].
            FieldType.TypeUsage.EdmType.BuiltInTypeKind;
        //read only fields that contain PrimitiveType
        if (fieldTypeKind == BuiltInTypeKind.RefType)
        {
            // Ref types are surfaced as EntityKey instances.
            // The containing record sees them as atomic.
            EntityKey key = record.GetValue(fieldIndex) as EntityKey;
            // Get the EntitySet name.
            Console.WriteLine("EntitySetName " + key.EntitySetName);
            // Get the Name and the Value information of the EntityKey.
            foreach (EntityKeyMember keyMember in key.EntityKeyValues)
            {
                Console.WriteLine("   Key Name: " + keyMember.Key);
                Console.WriteLine("   Key Value: " + keyMember.Value);
            }
        }
    }
}
Private Shared Sub ExecuteRefTypeQuery(ByVal esqlQuery As String)
    If esqlQuery.Length = 0 Then
        Console.WriteLine("The query string is empty.")
        Exit Sub
    End If

    Using conn As New EntityConnection("name=AdventureWorksEntities")
        conn.Open()

        ' Create an EntityCommand. 
        Using cmd As EntityCommand = conn.CreateCommand()
            cmd.CommandText = esqlQuery
            ' Execute the command. 
            Using rdr As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
                ' Start reading results. 
                While rdr.Read()
                    RefTypeVisitRecord(TryCast(rdr, IExtendedDataRecord))
                End While
            End Using
        End Using
        conn.Close()
    End Using
End Sub

Private Shared Sub RefTypeVisitRecord(ByVal record As IExtendedDataRecord)
    ' For RefType the record contains exactly one field. 
    Dim fieldIndex As Integer = 0

    ' If the field is flagged as DbNull, the shape of the value is undetermined. 
    ' An attempt to get such a value may trigger an exception. 
    If record.IsDBNull(fieldIndex) = False Then
        Dim fieldTypeKind As BuiltInTypeKind = record.DataRecordInfo.FieldMetadata(fieldIndex).FieldType.TypeUsage.EdmType.BuiltInTypeKind
        'read only fields that contain PrimitiveType 
        If fieldTypeKind = BuiltInTypeKind.RefType Then
            ' Ref types are surfaced as EntityKey instances. 
            ' The containing record sees them as atomic. 
            Dim key As EntityKey = TryCast(record.GetValue(fieldIndex), EntityKey)
            ' Get the EntitySet name. 
            Console.WriteLine("EntitySetName " & key.EntitySetName)
            ' Get the Name and the Value information of the EntityKey. 
            For Each keyMember As EntityKeyMember In key.EntityKeyValues
                Console.WriteLine(" Key Name: " & keyMember.Key)
                Console.WriteLine(" Key Value: " & keyMember.Value)
            Next
        End If
    End If
End Sub

関連項目