C# 如何使实体框架映射为DbDataReader?
我试图让实体框架为自定义查询返回多个结果,然后将其映射回实体框架代码优先模型。是否可以使用实体框架的内部映射引擎 我可以保证结果集中两个查询返回的行都直接映射到EF模型。作为内部需求,我不能使用存储过程C# 如何使实体框架映射为DbDataReader?,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我试图让实体框架为自定义查询返回多个结果,然后将其映射回实体框架代码优先模型。是否可以使用实体框架的内部映射引擎 我可以保证结果集中两个查询返回的行都直接映射到EF模型。作为内部需求,我不能使用存储过程 public void MultipleResultSets() { var db = new DbContext(); var command = db.Database.Connection.CreateCommand(); command.Connection.Op
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();
}
public void MultipleResultSets()
{
var db=new DbContext();
var command=db.Database.Connection.CreateCommand();
command.Connection.Open();
command.CommandText=
@"
从表格A中选择*;
从表B中选择*;
";
使用(var reader=command.ExecuteReader())
{
//映射表A行
var tablerows=新列表();
while(reader.Read())
tableARows.Add(reader.Map());/“Map()”不是真的
reader.NextResult();
//映射表B行
var tableBRows=新列表();
while(reader.Read())
tableARows.Add(reader.Map());/“Map()”不是真的
}
command.Connection.Close();
}
免责声明:我是项目的所有者
下面是一个扩展方法,您可以从my repository中找到,它使用内部映射引擎映射数据读取器
public static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader reader) where T : class
{
return ((IObjectContextAdapter) context).ObjectContext.Translate<T>(reader);
}
公共静态IEnumerable映射读取器(此DbContext上下文,DbDataReader读取器),其中T:class
{
返回((IObjectContextAdapter)context.ObjectContext.Translate(读取器);
}
然后,您可以像这样使用代码:
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();
}
public void MultipleResultSets()
{
var db=new DbContext();
var command=db.Database.Connection.CreateCommand();
command.Connection.Open();
command.CommandText=
@"
从表格A中选择*;
从表B中选择*;
";
使用(var reader=command.ExecuteReader())
{
//映射表A行
var tableARows=db.MapReader(reader);
reader.NextResult();
//映射表B行
var tableBRows=db.MapReader(reader);
}
command.Connection.Close();
}
注意:扩展方法已更新为使用Pawel answer“ObjectContext.Translate”免责声明:我是项目的所有者 下面是一个扩展方法,您可以从my repository中找到,它使用内部映射引擎映射数据读取器
public static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader reader) where T : class
{
return ((IObjectContextAdapter) context).ObjectContext.Translate<T>(reader);
}
公共静态IEnumerable映射读取器(此DbContext上下文,DbDataReader读取器),其中T:class
{
返回((IObjectContextAdapter)context.ObjectContext.Translate(读取器);
}
然后,您可以像这样使用代码:
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();
}
public void MultipleResultSets()
{
var db=new DbContext();
var command=db.Database.Connection.CreateCommand();
command.Connection.Open();
command.CommandText=
@"
从表格A中选择*;
从表B中选择*;
";
使用(var reader=command.ExecuteReader())
{
//映射表A行
var tableARows=db.MapReader(reader);
reader.NextResult();
//映射表B行
var tableBRows=db.MapReader(reader);
}
command.Connection.Close();
}
注意:扩展方法已更新为使用Pawel answer“ObjectContext.Translate”为什么需要将其作为返回多个结果集的查询,而不是只发送两个查询?@Pawel,减少数据库往返次数。不确定是否值得,但您可以将每个结果集公开为DbDataReader,并使用
ObjectContext.Translate
Method为什么需要将其作为一个返回多个结果集的查询,而不是只发送两个查询?@Pawel,减少数据库往返次数。不确定是否值得,但可以将每个结果集公开为DbDataReader,并使用ObjectContext.Translate
方法这看起来很棒。我尝试在我的一个表上运行它,并收到以下关于可为空的十进制列的错误(注意,我使用的是MySQL)。请参阅EntityFramework.dll中发生“System.InvalidOperationException”类型的未处理异常时的堆栈跟踪其他信息:“TableA”上的“ColumnA”属性无法设置为“System.String”值。您必须将此属性设置为“System.Decimal”类型的非空值。我用MySQL对其进行了测试,效果非常好。此方法与SqlQuery具有相同的限制,因此请尝试在每个查询中使用它来检查问题是否与您的查询之一有关:“db.Database.SqlQuery(“SELECT*FROM TableA”).ToList();”使用Translate
方法处理以前不起作用的查询。这看起来很棒。我尝试在我的一个表上运行它,并收到以下关于可为空的十进制列的错误(注意,我使用的是MySQL)。请参阅EntityFramework.dll中发生“System.InvalidOperationException”类型的未处理异常时的堆栈跟踪其他信息:“TableA”上的“ColumnA”属性无法设置为“System.String”值。您必须将此属性设置为“System.Decimal”类型的非空值。我用MySQL对其进行了测试,效果非常好。此方法与SqlQuery具有相同的限制,因此请尝试在每个查询中使用它来检查问题是否与某个查询有关:“db.Database.SqlQuery(“SELECT*FROM TableA”).ToList();”使用Translate
方法可以处理以前不起作用的查询。