繁体   English   中英

如何使Entity Framework映射成为DbDataReader?

[英]How can I make Entity Framework map a DbDataReader?

我试图使Entity Framework返回多个自定义查询结果,然后将其映射回Entity Framework Code First模型。 是否可以使用Entity Framework的内部映射引擎?

我可以保证结果集中两个查询返回的行都直接映射到EF模型。 作为内部要求,我不能使用存储过程。

public void MultipleResultSets()
{
    var db = new DbContext();
    var command = db.Database.Connection.CreateCommand();
    command.Connection.Open();
    command.CommandText =
        @"
        SELECT * FROM TableA; 
        SELECT * FROM TableB;
        ";

    using (var reader = command.ExecuteReader())
    {
        // Map Table A rows
        var tableARows = new List<TableARow>();
        while (reader.Read())
            tableARows.Add(reader.Map<TablARow>()); // "Map()" is not real

        reader.NextResult();

        // Map Table B rows
        var tableBRows = new List<TableBRow>();
        while (reader.Read())
            tableARows.Add(reader.Map<TablBRow>()); // "Map()" is not real
    }
    command.Connection.Close();
}

免责声明 :我是EF +项目的所有者。

您可以从我的存储库中找到一种扩展方法,该方法使用内部映射引擎映射数据读取器。

public static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader reader) where T : class
{
    return ((IObjectContextAdapter) context).ObjectContext.Translate<T>(reader);    
}

然后,您可以像下面这样使用代码:

public void MultipleResultSets()
{
    var db = new DbContext();
    var command = db.Database.Connection.CreateCommand();
    command.Connection.Open();
    command.CommandText =
        @"
        SELECT * FROM TableA; 
        SELECT * FROM TableB;
        ";

    using (var reader = command.ExecuteReader())
    {
        // Map Table A rows
        var tableARows = db.MapReader<TableA>(reader);

        reader.NextResult();

        // Map Table B rows
        var tableBRows = db.MapReader<TableB>(reader);
    }
    command.Connection.Close();
}

注意 :扩展方法已更新为使用Pawel答案“ ObjectContext.Translate”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM