本主题提供一个示例,该示例演示如何使用 EntityCommand 对实体数据模型执行命令,以及如何使用 EntityDataReader 检索 RefType 结果。
运行本示例中的代码
- 将 AdventureWorks 销售模型添加到项目并将项目配置为使用实体框架。为此,请执行下列操作之一: - 如果已安装实体数据模型工具,请完成如何:使用实体数据模型向导(实体框架) 中的过程。 
- 否则,请完成如何:手动配置实体框架项目和如何:手动定义实体数据模型(实体框架) 中的过程。 
 
- 在应用程序的代码页中,添加以下 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);
            }
        }
    }
}