【问题标题】:Calling stored procedure in EF asynchronously using c#使用c#异步调用EF中的存储过程
【发布时间】: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>' 不包含 'ToList' 的定义,并且没有可访问的扩展方法 'ToList' 接受类型为 'Task>' 的第一个参数找到(您是否缺少 using 指令或程序集引用?)

更改 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


【解决方案1】:

你必须awaitProc_sp返回的任务才能得到任务的结果:

var check = await ctx.Proc_sp(x, y);

【讨论】:

  • 当我这样做时,我得到低于错误'int?'不包含“GetAwaiter”的定义,并且没有可访问的扩展方法“GetAwaiter”接受“int?”类型的第一个参数可以找到(你错过了你吗
  • 如果Proc_sp 返回Task&lt;ObjectResult&lt;Nullable&lt;int&gt;&gt;&gt;,那是不可能的。
猜你喜欢
  • 2020-01-15
  • 1970-01-01
  • 2011-03-18
  • 2010-09-06
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多