使用C#inside async方法从EF异步调用存储过程
我们正在转向实体框架,但是我们有大量的存储过程。如果我们的Web API在存储过程调用中一直使用异步/等待模式,那么如何处理该调用?我可以/应该让它也异步吗 我有一个db上下文,可以同步调用存储过程使用C#inside async方法从EF异步调用存储过程,c#,stored-procedures,async-await,entity-framework-6,C#,Stored Procedures,Async Await,Entity Framework 6,我们正在转向实体框架,但是我们有大量的存储过程。如果我们的Web API在存储过程调用中一直使用异步/等待模式,那么如何处理该调用?我可以/应该让它也异步吗 我有一个db上下文,可以同步调用存储过程Foo。但是,调用代码都用async/await关键字包装。所讨论的存储过程也是一个Select,而不是Insert/Update/Delete。如果我尝试,我无法在context.Foo调用上使用ToListAsync() context.Database.ExecutSQLCommandAsync
Foo
。但是,调用代码都用async/await关键字包装。所讨论的存储过程也是一个Select
,而不是Insert/Update/Delete
。如果我尝试,我无法在context.Foo
调用上使用ToListAsync()
context.Database.ExecutSQLCommandAsync()
我只得到一个任务
而不是我的对象。这里有最佳实践吗
public async Task<List<FooData>> GetFoo(string param)
{
List<FooData> dataList = new List<FooData>();
using(dbEntities context = new dbEntities(connectionstring))
{
// this runs as expected
var result = context.Foo(param).ToList();
if(result != null)
{
result.ForEach(delegate(Foo_Result item)
{
// load object
});
}
}
return dataList;
}
但这是一个实体框架db调用,而不是CPU密集型进程。这里有没有最佳实践可以遵循?谢谢如果您想要一个结果集,那么您需要
Database.SqlQuery
public class MyDbContext : DbContext
{
public async Task<IList<Foo>> GetFooAsync(int n)
{
var query = base.Database.SqlQuery<Foo>("exec fooStoredProc @n",
new SqlParameter("@n", n));
return await query.ToListAsync();
}
}
这假设您的存储过程返回与您的Foo类匹配的字段。请参见此答案,它似乎不适用于直接调用的存储过程。
public class MyDbContext : DbContext
{
public async Task<IList<Foo>> GetFooAsync(int n)
{
var query = base.Database.SqlQuery<Foo>("exec fooStoredProc @n",
new SqlParameter("@n", n));
return await query.ToListAsync();
}
}
public async Task Exec()
{
MyDbContext db = new MyDbContext();
var foos = await db.GetFooAsync(1);
}