EntityFramework存储过程函数导入是否可以读取异步?

时间:2014-09-17 23:19:29

标签: c# entity-framework asynchronous entity-framework-6 entity-framework-6.1

我正在使用EF 6.1.1和Database First。当我将存储过程导入edmx并生成DBContext时,它看起来像这样:

return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<TestSP_Result>("TestSP", params[]...)

返回一个ObjectResult&lt; T&gt;,实现IDbAsyncEnumerable&lt; T>所以我这样做是为了读取数据异步:

 IDbAsyncEnumerable<T> enumerable = objectResult as IDbAsyncEnumerable<T>;
 IDbAsyncEnumerator<T> enumerator = enumerable.GetAsyncEnumerator();
 List<T> list = new List<T>();
 bool moreItems = await enumerator.MoveNextAsync(CancellationToken.None);

 while (moreItems)
 {
     list.Add(enumerator.Current);
     moreItems = await enumerator.MoveNextAsync(CancellationToken.None);
 }
 return list;

这是否真的异步读取数据?我附加了探查器,实际的SQL语句在ExecuteFunction行中运行,而不是在枚举结果时。

是否有正确的方法从DBContext运行存储过程并异步读取结果?

1 个答案:

答案 0 :(得分:14)

我是怎么做到的:

var results = await ctx.Database.SqlQuery<TResult>("EXEC sp_foo {0}, {1}", p1, p2)
                  .ToArrayAsync();
相关问题