entity-framework - EF6 alpha 异步等待实体存储过程/函数导入?

标签 entity-framework async-await c#-5.0 entity-framework-6

我想将新的异步等待功能应用于在我的实体模型中导入的存储过程/函数导入,但目前还无法使用 EF6 alpha。

是否可以在 EF6 alpha2(或自 20211 起的夜间版本)中调用返回复杂类型集合的实体函数导入(调用 SQL 存储过程)上的任何新异步方法?例如

private async Task<IList<Company>> getInfo (string id)
{
    using (CustomEntity context = new CustomEntity())
    {
        var query = await context.customStoredProcedure(id).ToListAsync();
        // ".ToListAsync()" method not available on above line

        // OR ALTERNATIVELY
        var query = await (from c in context.customStoredProcedure(id)
                           select new Company
                           {
                              Ident = c.id,
                              Name = c.name,
                              Country = c.country,
                              Sector = c.sector, 
                              etc. etc....
                           }).ToListAsync();
        // ".ToListAsync()" method or any "...Async" methods also not available this way

        return query;
    }
}

“ToListAsync”或任何新的异步修改方法似乎不适用于上述实体存储过程/函数导入;仅标准的“ToList”或“AsNumerable”等方法可用。

我按照此操作 ( http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6 ) 确保代码引用新的 EF6 dll 而不是 EF5,并更新了各种 using 语句。除了上面的内容之外,一切都正确构建。 (.NET Framework 4.5)

我唯一能看到异步方法的情况是,我不仅从数据库导入存储过程,还导入一个表——然后,当通过上面的实体上下文 (context.SomeTable) 引用该表时,某些异步方法出现在智能感知中。

我真的很想在以 JSON 形式返回数据之前开始在多个存储过程上使用新的 async wait 功能,但到目前为止还无法让它工作。

我做错了什么吗?实体存储过程/函数导入无法使用异步功能吗?感谢您的建议。

最佳答案

现在这绝不是最好的解决方案。我添加了一个扩展方法,以便我可以在存储过程上调用await。在 EF6.1+ 的新版本中,我们应该会看到这一点被正式实现。在此之前,虚拟扩展方法会完成这项工作。

static async Task<List<T>> ToListAsync<T>(this ObjectResult<T> source)
{
    var list = new List<T>();
    await Task.Run(() => list.AddRange(source.ToList()));
    return list;
}

如果您反射(reflect) EF 版本 6,您将看到 ObjectResult<T>实际上实现了 IDbAsyncEnumerable<T>, IDbAsyncEnumerable 。以及 ToListAsync<T>(this IDbAsyncEnumerable<T> source) 的方法应该能够像 LINQ 查询一样连接它。

编辑 当 ObjectResult 为空时,返回 null。您可以添加if (source == null) return new List<T>();如果你想返回一个空列表而不是 null。

关于entity-framework - EF6 alpha 异步等待实体存储过程/函数导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15051375/

相关文章:

c# - 如何用Linq SqlQuery 构造MySqlParamter?

c# - Oracle Entity Framework 'Specified cast is not valid' GetDecimal

.net - Task.Run 代码不执行

javascript - 是否可以在 javascript 中删除 async/await 并使 async 透明?

c# - 使用实体配置与多个表的一对一/一关系

c# - Entity Framework 添加新实体

javascript - 等待数组被填充,然后渲染这些组件

asp.net-mvc - 什么时候以及为什么不在C#5.0 ASP.NET MVC 4或Web API中使用基于任务的异步编程

C# .net 4.5 异步委托(delegate)

.net-4.0 - 使用 VS2010 Async CTP 的主要风险与好处是什么?