Share via


HOW TO:執行會傳回 RefType 結果的查詢 (EntityClient)

本主題提供的範例將說明如何藉由使用 EntityCommand 對 Entity Data Model 執行命令,以及如何藉由使用 EntityDataReader 擷取 RefType 結果。

若要執行這個範例中的程式碼

  1. 將 AdventureWorks Sales 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.Data.SqlClient
    Imports System.Data.EntityClient
    Imports System.Data.Metadata.Edm
    Imports System.IO
    ' Add AdventureWorksModel prepended with the root namespace for the project.
    'Imports ProjectName.AdventureWorksModel
    
    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 AdventureWorksModel;
    using System.Data.Metadata.Edm;
    

範例

若要測試程式碼,將下列查詢當成引數傳遞至 ExectueRefTypeQuery 函式:

"SELECT REF(p) FROM AdventureWorksEntities.Product as p"

上述查詢會傳回 RefType 結果。

Sub ExectueRefTypeQuery(ByVal esqlQuery As String)
    If (esqlQuery.Length = 0) Then
        Console.WriteLine("The query string is empty.")
        Return
    End If

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

        Try
            ' Create an EntityCommand.
            Using cmd As EntityCommand = conn.CreateCommand()
                cmd.CommandText = esqlQuery
                ' Execute the command.
                Using reader As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)
                    Do While (reader.Read())
                        RefTypeVisitRecord(CType(reader, IExtendedDataRecord))
                    Loop
                End Using
            End Using
        Catch ex As Exception
            Console.WriteLine(ex.ToString())
        End Try
        conn.Close()
    End Using
End Sub

Sub RefTypeVisitRecord(ByVal record As IExtendedDataRecord)
    ' For RefType the record contains exactly one field.
    Dim fieldIndex As Integer
    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) 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 = CType(record.GetValue(fieldIndex), EntityKey)
            ' Get the EntitySet name.
            Console.WriteLine("EntitySetName " + key.EntitySetName)
            ' Get the Name and the Value information of the EntityKey.
            Dim keyMember As EntityKeyMember
            For Each keyMember In key.EntityKeyValues
                Console.WriteLine("   Key Name: " + keyMember.Key)
                Console.WriteLine("   Key Value: " + keyMember.Value)
            Next
        End If
    End If
End Sub
static void ExectueRefTypeQuery(string esqlQuery)
{
    if (esqlQuery.Length == 0)
    {
        Console.WriteLine("The query string is empty.");
        return;
    }

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

        try
        {
            // 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);
                    }
                }
            }
        }
        catch (EntityException ex)
        {
            Console.WriteLine(ex.ToString());
        }
        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);
            }
        }
    }
}

另請參閱

概念

Entity SQL 參考

其他資源

使用 EntityClient (Entity Framework 工作)