如何让Entity Framework映射到DbDataReader?

时间:2016-01-24 02:42:42

标签: c# mysql entity-framework

我试图让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();
}

1 个答案:

答案 0 :(得分:2)

免责声明:我是该项目的所有者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 = db.MapReader<TableA>(reader);

        reader.NextResult();

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

然后您可以像这样使用您的代码:

int main(void) {
   char qwe[] = "qwe";
   //   ^^^^^
   qwe[2] = '\0';
   printf("%s\n", qwe); // prints "qw"
   return 0;
}

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