Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#inside async方法从EF异步调用存储过程_C#_Stored Procedures_Async Await_Entity Framework 6 - Fatal编程技术网

使用C#inside async方法从EF异步调用存储过程

使用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

我们正在转向实体框架,但是我们有大量的存储过程。如果我们的Web API在存储过程调用中一直使用异步/等待模式,那么如何处理该调用?我可以/应该让它也异步吗

我有一个db上下文,可以同步调用存储过程
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);
}