我正在使用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运行存储过程并异步读取结果?
答案 0 :(得分:14)
我是怎么做到的:
var results = await ctx.Database.SqlQuery<TResult>("EXEC sp_foo {0}, {1}", p1, p2)
.ToArrayAsync();