我试图让 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/