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