C# 使用EntityDataReader从数据库读取实体对象

C# 使用EntityDataReader从数据库读取实体对象,c#,entity-framework-6,ado.net,sqldatareader,C#,Entity Framework 6,Ado.net,Sqldatareader,由于某些原因,我需要使用ADO.Net直接从数据库读取实体对象 我在下面找到了一段。我想知道是否有任何方法可以使用EntityDataReader而不是将每个字段映射到每个属性来将整行读取到一个Onject(“本示例中的contact”)中?我的意思是,除了逐个读取Contact.Id和Contact.Name和其他字段外,是否有任何方法可以将一行读取到一个对象中 using (EntityConnection conn = new EntityConnection("name=Adve

由于某些原因,我需要使用ADO.Net直接从数据库读取实体对象

我在下面找到了一段。我想知道是否有任何方法可以使用
EntityDataReader
而不是将每个字段映射到每个属性来将整行读取到一个Onject(“本示例中的contact”)中?我的意思是,除了逐个读取
Contact.Id
Contact.Name
和其他字段外,是否有任何方法可以将一行读取到一个对象中

using (EntityConnection conn =
    new EntityConnection("name=AdventureWorksEntities"))
{
    conn.Open();

    string esqlQuery = @"SELECT VALUE contacts FROM
            AdventureWorksEntities.Contacts AS contacts
            WHERE contacts.ContactID == @id";

    // Create an EntityCommand.
    using (EntityCommand cmd = conn.CreateCommand())
    {
        cmd.CommandText = esqlQuery;
        EntityParameter param = new EntityParameter();
        param.ParameterName = "id";
        param.Value = 3;
        cmd.Parameters.Add(param);

        // Execute the command.
        using (EntityDataReader rdr =
            cmd.ExecuteReader(CommandBehavior.SequentialAccess))
        {
            // The result returned by this query contains
            // Address complex Types.
            while (rdr.Read())
            {
                // Display CustomerID
                Console.WriteLine("Contact ID: {0}",
                    rdr["ContactID"]);
                // Display Address information.
                DbDataRecord nestedRecord =
                    rdr["EmailPhoneComplexProperty"] as DbDataRecord;
                Console.WriteLine("Email and Phone Info:");
                for (int i = 0; i < nestedRecord.FieldCount; i++)
                {
                    Console.WriteLine("  " + nestedRecord.GetName(i) +
                        ": " + nestedRecord.GetValue(i));
                }
            }
        }
    }
    conn.Close();
}
使用(实体连接连接)=
新EntityConnection(“名称=AdventureWorksEntities”))
{
conn.Open();
字符串esqlQuery=@“从联系人中选择值”
AdventureWorksEntities。联系人作为联系人
其中contacts.ContactID==@id”;
//创建EntityCommand。
使用(EntityCommand cmd=conn.CreateCommand())
{
cmd.CommandText=esqlQuery;
EntityParameter param=新的EntityParameter();
param.ParameterName=“id”;
参数值=3;
cmd.Parameters.Add(param);
//执行命令。
使用(EntityDataReader rdr)=
cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
//此查询返回的结果包含
//解决复杂类型的问题。
while(rdr.Read())
{
//显示客户ID
Console.WriteLine(“联系人ID:{0}”),
rdr[“联系人ID]”);
//显示地址信息。
DbDataRecord嵌套记录=
rdr[“EmailPhoneComplexProperty”]作为DbDataRecord;
Console.WriteLine(“电子邮件和电话信息:”);
for(int i=0;i
您最干净的选择是使用@herosper建议的EntityFramework执行查询

在您的示例中,您需要执行以下操作:

EntityContext ctx = new EntityContext();
var contacts= ctx.Contacts
    .SqlQuery("SELECT * FROM AdventureWorksEntities.Contacts AS contacts" 
+ "WHERE contacts.ContactID =@id", new SqlParameter("@id", 3)).ToList();
从这里,您可以:

var myvariable = contacts[0].ContactID;//zero is index of list. you can use foreach loop.
var mysecondvariable = contacts[0].EmailPhoneComplexProperty;
或者,您可以通过执行以下操作跳过整个SQL字符串:

EntityContext ctx = new EntityContext();
var contact= ctx.Contacts.Where(a=> a.ContactID ==3).ToList();

我假设查询返回多条记录,否则您将只使用
FirstOrDefault()
而不是
Where()

您的意思是可以创建扩展方法来映射类吗。。。或者使用automapper