Поделиться через


Как выполнить запрос, возвращающий результаты типа StructuralType (EntityClient)

В этом разделе приведен пример того, как выполнить команду применительно к модели EDM с использованием EntityCommand и как получить результаты StructuralType с использованием EntityDataReader. Объекты EntityType, RowType и ComplexType являются производными от StructuralType.

Выполнение кода в этом примере

  1. Добавьте модель AdventureWorks Sales к проекту и настройте проект для использования платформы Entity Framework. Для этого выполните одно из следующих действий.

  2. На странице кода приложения добавьте следующие инструкции using (Imports в Visual Basic):

    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;
    

Примеры

Чтобы проверить код, передайте следующий запрос в качестве аргумента для функции ExecuteStructuralTypeQuery:

"SELECT VALUE Product FROM AdventureWorksEntities.Product AS Product"

Приведенный выше запрос возвращает результаты EntityType.

Sub ExecuteStructuralTypeQuery(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())
                        StructuralTypeVisitRecord(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 StructuralTypeVisitRecord(ByVal record As IExtendedDataRecord)
    Dim fieldCount As Integer
    fieldCount = record.DataRecordInfo.FieldMetadata.Count
    Dim fieldIndex As Integer
    For fieldIndex = 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
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();

        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())
                    {
                        StructuralTypeVisitRecord(rdr as IExtendedDataRecord);
                    }
                }
            }
        }
        catch (EntityException ex)
        {
            Console.WriteLine(ex.ToString());
        }
        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());
            }
        }
    }
}

См. также

Основные понятия

Справочник по Entity SQL

Другие ресурсы

Работа с EntityClient (задачи платформы Entity Framework)