如何:执行返回 StructuralType 结果的查询How to: Execute a Query that Returns StructuralType Results

本主题演示如何使用 EntityCommand 对象针对概念模型执行命令,以及如何使用 StructuralType 检索 EntityDataReader 结果。This topic shows how to execute a command against a conceptual model by using an EntityCommand object, and how to retrieve the StructuralType results by using an EntityDataReader. EntityTypeRowTypeComplexType 类派生自 StructuralType 类。The EntityType, RowType and ComplexType classes derive from the StructuralType class.

运行本示例中的代码To run the code in this example

  1. AdventureWorks 销售模型 添加到项目中,并将项目配置为使用实体框架。Add the AdventureWorks Sales Model to your project and configure your project to use the Entity Framework. 有关详细信息,请参阅 如何:使用实体数据模型向导For more information, see How to: Use the Entity Data Model Wizard.

  2. 在应用程序的代码页中,添加以下 using 语句(在 Visual Basic 中为 Imports):In the code page for your application, add the following using statements (Imports in Visual Basic):

    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
    
    

示例Example

本示例执行返回 EntityType 结果的查询。This example executes a query that returns EntityType results. 如果将以下查询作为自变量传递给 ExecuteStructuralTypeQuery 函数,则该函数将显示有关 Products 的详细信息:If you pass the following query as an argument to the ExecuteStructuralTypeQuery function, the function displays details about the Products:

SELECT VALUE Product FROM AdventureWorksEntities.Products AS Product

如果传递参数化查询(如下面的查询),请将 EntityParameter 对象添加到 Parameters 对象的 EntityCommand 属性。If you pass a parameterized query, like the following, add the EntityParameter objects to the Parameters property on the EntityCommand object.

SELECT VALUE product FROM AdventureWorksEntities.Products
    AS product where product.ListPrice >= @price
static void ExecuteStructuralTypeQuery(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())
                {
                    StructuralTypeVisitRecord(rdr as IExtendedDataRecord);
                }
            }
        }
        conn.Close();
    }
}

static void StructuralTypeVisitRecord(IExtendedDataRecord record)
{
    int fieldCount = record.DataRecordInfo.FieldMetadata.Count;
    for (int fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++)
    {
        Console.Write(record.GetName(fieldIndex) + ": ");

        // 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;
            // The EntityType, ComplexType and RowType are structural types
            // that have members.
            // Read only the PrimitiveType members of this structural type.
            if (fieldTypeKind == BuiltInTypeKind.PrimitiveType)
            {
                // Primitive types are surfaced as plain objects.
                Console.WriteLine(record.GetValue(fieldIndex).ToString());
            }
        }
    }
}
Private Shared Sub ExecuteStructuralTypeQuery(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()
                    StructuralTypeVisitRecord(TryCast(rdr, IExtendedDataRecord))
                End While
            End Using
        End Using
        conn.Close()
    End Using
End Sub

Private Shared Sub StructuralTypeVisitRecord(ByVal record As IExtendedDataRecord)
    Dim fieldCount As Integer = record.DataRecordInfo.FieldMetadata.Count
    For fieldIndex As Integer = 0 To fieldCount - 1
        Console.Write(record.GetName(fieldIndex) & ": ")

        ' 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
            ' The EntityType, ComplexType and RowType are structural types 
            ' that have members. 
            ' Read only the PrimitiveType members of this structural type. 
            If fieldTypeKind = BuiltInTypeKind.PrimitiveType Then
                ' Primitive types are surfaced as plain objects. 
                Console.WriteLine(record.GetValue(fieldIndex).ToString())
            End If
        End If
    Next
End Sub

请参阅See also