【发布时间】:2021-04-02 14:35:36
【问题描述】:
我的 C# MVC 应用程序正在使用 EF 调用 db 中的存储过程。在 Context.cs(自动生成)文件中,代码如下所示
public virtual ObjectResult<Nullable<int>> Proc_sp(Nullable<int> x, Nullable<int> y)
{
var xParameter = x.HasValue ?
new ObjectParameter("x", x) :
new ObjectParameter("x", typeof(int));
var yParameter = y.HasValue ?
new ObjectParameter("y", y) :
new ObjectParameter("y", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<int>>("Proc_sp", x, y);
}
我使用下面的代码调用它
var check = ctx.Proc_sp(x, y).ToList().FirstOrDefault();
我的问题是,我如何使这段代码异步。我尝试将 context.cs 更改为如下
public virtual async Task<ObjectResult<Nullable<int>>> Proc_sp(Nullable<int> x, Nullable<int> y)
{
var query = base.Database.SqlQuery<ObjectResult<Nullable<int>>>("exec Proc_SP @x @y",
new SqlParameter("@x", x),
new SqlParameter("@y", y)
);
return await query.FirstOrDefaultAsync();
}
当我这样做时,调用部分出现以下错误
错误 CS1061 'Task
更改 Context.cs 文件的正确方法是什么,以便我不必更改以下行
var check = ctx.Proc_sp(x, y).ToList().FirstOrDefault();
我的目标是让 sp 调用异步而不对调用者进行更改或进行最小的更改(我理解调用者必须进行一些最小的更改,例如将 FirstOrDefault 更改为 FirstOrDefaultAsync)。还有其他最好的方法吗?
提前致谢。
【问题讨论】:
-
如果不一起写一些代码我不确定,但你为什么要调用 .ToList ?您可以在没有 ToList 的情况下调用 FirstOrDefault 还是该代码无效?
-
首先你应该后缀
Proc_spAsync其次如果你有一个异步方法,你需要等待它await Proc_spAsync(x, y)显然你不能ToList它,你已经在实际方法中调用了FirstOrDefault -
@S.Walker 这是现有的代码。删除 ToList 是唯一的选择吗?在客户端代码中删除 ToList 后,我得到以下错误错误 CS1061“Task
>”不包含“FirstOrDefault”的定义,并且没有可访问的扩展方法“FirstOrDefault”接受“Task >' 可以找到 -
@TheGeneral 更改 sp 的名称不是问题。但是代码是处理 ObjectResult
> 使其异步的正确方法吗?
标签: c# entity-framework stored-procedures async-await