在EF Core 2.1中执行异步非可选存储过程

时间:2018-08-03 06:15:51

标签: asp.net-core entity-framework-core asp.net-core-2.0 asp.net-core-webapi entity-framework-core-2.1

我正在尝试在EF Core 2.1中执行异步不可选择的存储过程。

  return Ok(
              await db.Set()
              .FromSql($"EXECUTE PROCEDURE MY_PROC({id})")
              .ToListAsync());

错误

  

不能从用法中推断出方法'DbContext.Set()'的类型参数。尝试明确指定类型参数

我也尝试过:

return Ok(
             await db.MYDB
              .FromSql($"EXECUTE PROCEDURE MY_PROC({id})")              
             .ToListAsync());

错误

  控制台中

500(内部服务器错误)

然后我尝试创建一个静态方法:

public static async Task ExecSqlNonQuery(Entities db, string sql)
{
     using (var com = db.Database.GetDbConnection().CreateCommand())
     {
         com.CommandText = sql;
         com.CommandType = CommandType.StoredProcedure;
         db.Database.OpenConnection();
         await com.ExecuteNonQueryAsync();
     };
}
....
return Ok( await ExecSqlNonQuery(db,$"EXECUTE PROCEDURE MY_PROC({id})");   

但是使用此代码,我得到:

  

参数1:无法从“无效”转换为“对象”

仅适用于非异步和老式方式:

public static  bool ExecSqlNonQuery(Entities db, string sql)
{
    try
    {
        using (var com = db.Database.GetDbConnection().CreateCommand())
        {
            com.CommandText = sql;
            com.CommandType = CommandType.StoredProcedure;

            db.Database.OpenConnection();
            com.ExecuteNonQuery();

            return true;
        };
    }
    catch (Exception)
    {
        return false;
    }
}
......
return Ok(ExecSqlNonQuery(db, $"EXECUTE PROCEDURE MY_PROC({id})"););

有帮助吗?谢谢

1 个答案:

答案 0 :(得分:2)

FromSql方法用于返回SQL命令的记录集(查询)。对于其他类型的命令,应使用某些ExecuteSqlCommandExecuteSqlCommandAsync方法重载。

  

对数据库执行给定的SQL,并返回受影响的行数。

例如(假设SQL语法正确):

await db.Database.ExecuteSqlCommandAsync($"EXECUTE PROCEDURE MY_PROC({id})");
return Ok();