我通过以下方式调用 EF Core 2.0 中的存储过程。
private async Task<IEnumerable<TEntity>> InvokeStoredProcedureAsync(string entityName)
{
var storedProcedureName = string.Format(CultureInfo.InvariantCulture, "sp_{0}BulkSelect", entityName);
dynamic temp;
using (MyDbContext MyDbContext = new MyDbContext(_options))
{
MyDbContext.Database.OpenConnection();
DbCommand cmd = MyDbContext.Database.GetDbConnection().CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = storedProcedureName;
using (var reader = cmd.ExecuteReader())
{
temp = reader.Cast<Task<IEnumerable<TEntity>>>();
}
}
return await temp;
}
我需要从 DbDataReader
转换至 Task<IEnumerable<TEntity>>
.
但在尝试扩展临时变量以查看其值时出现此错误。
Invalid attempt to call FieldCount when reader is closed.
请引用随附的屏幕截图。
最佳答案
除了明显的异步代码问题外,您无法通过简单地调用 Cast
将 DbDataReader
实现为类。如果可能的话,就不需要像 Dapper 和类似的微型 ORM。
EF Core 当前未公开执行此操作的公共(public)方式。但是如果 TEntity
是模型实体类,您可以简单地使用 FromSql
方法:
private async Task<IEnumerable<TEntity>> InvokeStoredProcedureAsync(string entityName)
{
var storedProcedureName = string.Format(CultureInfo.InvariantCulture, "sp_{0}BulkSelect", entityName);
using (var db = new MyDbContext(_options))
{
var result = await db.Set<TEntity>().FromSql(storedProcedureName).ToListAsync();
return result;
}
}
确保 SP 通过 TEntity
映射返回所有预期的列。
关于c# - 如何在 Entity Framework Core 2.0 中从 DbDataReader 转换为 Task<IEnumerable<TEntity>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48565680/