[英]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.