c# - 如何使 Entity Framework 映射 DbDataReader?

标签 c# mysql entity-framework

我试图让 Entity Framework 返回自定义查询的多个结果,然后将其映射回 Entity Framework 代码优先模型。是否可以使用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”

关于c# - 如何使 Entity Framework 映射 DbDataReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34971629/

相关文章:

Mysql:如何构建一个表来保存各种社交网络的用户名?

mysql - 从多个 SQL 文件恢复 SQL

php - 创建自定义存储库原则

c# - 仅对 DbContext 中的一个查询使用选项 IsolationLevel.ReadUncommited

c# - 使用 'EntityFramework 6.2.0' 而不是项目目标框架 '.NETFramework,Version=v4.6.1' 恢复包 '.NETCoreApp,Version=v2.0'

c# - 如何通过这段代码匹配以 "أقول "开头的句子?

c# - 在日历日打开文本框单击

c# - 如何在没有任何迁移的情况下强制使用新种子

c# - 如何确定上传的文件是 UTF-8 还是 UTF-16?

c# - 从计时器线程更新 WPF UI