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

本主題顯示如何使用 EntityCommand 物件,針對概念模型執行命令,以及如何使用 EntityDataReader 擷取 RefType 結果。

執行此範例中的程式碼

  1. AdventureWorks 銷售模型 加入至專案中,並將專案設定為使用 Entity Framework 。 如需詳細資訊,請參閱 HOW TO:使用實體資料模型精靈 (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;
    

範例

此範例會執行傳回 RefType 結果的查詢。 如果您將下列查詢當做引數傳遞至 ExectueRefTypeQuery 函式,則函式會傳回實體的參考:

SELECT REF(p) FROM AdventureWorksEntities.Products as p

如果您傳遞了參數型查詢 (類似下列查詢),請將 EntityParameter 物件加入至 EntityCommand 物件的 Parameters 屬性。

SELECT REF(p) FROM AdventureWorksEntities.Products as p WHERE p.ProductID == @productID
Private Shared Sub ExectueRefTypeQuery(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
static public 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();

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

另請參閱

概念

Entity SQL 參考
Entity Framework 的 EntityClient 提供者