如何:执行返回 StructuralType 结果的查询 (EntityClient)
本主题提供一个示例,该示例演示如何使用 EntityCommand 对实体数据模型执行命令,以及如何使用 EntityDataReader 检索 StructuralType 结果。EntityType、RowType 和 ComplexType 派生自 StructuralType。
运行本示例中的代码
将 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;
示例
若要测试此代码,请将以下查询作为参数传递给 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());
}
}
}
}