c# - 如何在 Entity Framework Core 2.0 中从 DbDataReader 转换为 Task<IEnumerable<TEntity>>?

标签 c# entity-framework asp.net-core entity-framework-core ef-core-2.0

我通过以下方式调用 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.

请引用随附的屏幕截图。

enter image description here

最佳答案

除了明显的异步代码问题外,您无法通过简单地调用 CastDbDataReader 实现为类。如果可能的话,就不需要像 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/

相关文章:

c# - 我怎样才能使 Byte[] 可以为空

c# - 可移植类库中的 ConcurrentBag 替代方案

c# - session 的 Azure WebJob ServiceBusTrigger

c# - UWP 中的 ListView 在 INotifyCollectionChanged 报告批量更改时出现意外行为

azure - Adal 到 Msal 转换 -> JWT token 验证

asp.net-core - Redis 不会从数据库中删除记录

azure - 在反向代理后面使用 Azure AD 身份验证的 ASP.NET Core 应用程序设置了错误的 redirect_uri

c# - 如何使用 C# 轻松运行 shell 命令?

entity-framework - Entity Framework 和原始字符串查询 - SQL 注入(inject)预防

c# - Entity Framework 4 获取插入记录的主键 ID