.NET Core Web API如何解决int无GetAwaiter定义报错
报错根因
报错核心是方法用错了:ExecuteSqlInterpolated是EF Core提供的同步执行SQL的方法,返回值就是int类型(代表语句执行影响的行数),本身不是可等待的Task类型。你直接对int类型的返回值加await关键字,编译器找不到int类型对应的GetAwaiter实现,就会抛出这个错误。
网上说的加ToListAsync()是针对返回结果集的查询类存储过程的方案,你的存储过程只返回执行状态值,确实不适用。
修复方法
根据你需要的异步/同步编码模式选对应写法即可:
- 保留async/await异步写法:替换为对应的异步方法
ExecuteSqlInterpolatedAsync,该方法返回Task<int>,可直接被await:
public async Task<int> CreateData(int id, string name) { return await _dbContext.Database.ExecuteSqlInterpolatedAsync($"execute spname {id}, {name}"); }
补充说明:上面写法拿到的int值是存储过程执行影响的行数,如果你要获取存储过程内部通过
RETURN语句返回的1/0状态值,需要定义输出参数接收,参考代码:
public async Task<int> CreateData(int id, string name) { var returnParameter = new SqlParameter { ParameterName = "@spResult", SqlDbType = System.Data.SqlDbType.Int, Direction = System.Data.ParameterDirection.Output }; await _dbContext.Database.ExecuteSqlInterpolatedAsync($"exec @spResult = spname {id}, {name}"); return (int)returnParameter.Value; }
- 用同步写法:直接去掉方法的async、await关键字,保留原有同步方法调用即可:
public int CreateData(int id, string name) { return _dbContext.Database.ExecuteSqlInterpolated($"execute spname {id}, {name}"); }
内容的提问来源于stack exchange,提问作者Nilesh
相关产品推荐
相关产品推荐

