gpt4 book ai didi

c# - 在异步方法中使用 C# 从 EF 异步调用存储过程

转载 作者:太空宇宙 更新时间:2023-11-03 11:59:02 24 4
gpt4 key购买 nike

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

我有一个数据库上下文,我可以调用我的存储过程 Foo同步地。这是可行的,但是调用代码全部用 async/await 关键字包装。有问题的存储过程也是一个 Select而不是 Insert/Update/Delete .我不能使用 ToListAsync()context.Foo 上打电话,如果我尝试

context.Database.ExecutSQLCommandAsync() 

我只得到一个 Task<int>回来又不是我的对象。这里有最佳实践吗?

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;
}

我想我可以做到这一点

var result = await Task.Run(()=> context.Foo(param).ToList());

但这是一个 Entity Framework 数据库调用,而不是 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();
}
}

随着使用

public async Task Exec()
{
MyDbContext db = new MyDbContext();
var foos = await db.GetFooAsync(1);
}

这假设您的存储过程返回与您的 Foo 类匹配的字段。

关于c# - 在异步方法中使用 C# 从 EF 异步调用存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57928387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com