You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET项目中使用EF Core调用存储过程报错求助

调用带参数存储过程时的方法重载错误解决办法

问题重现

创建REST API时调用带参数的存储过程,使用以下代码时出现错误:

var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter).ToList();

错误提示:

No Overload Method for SqlQuery takes 2 arguments

用户最初的代码:

[HttpGet]
public async Task<ActionResult<IEnumerable<string>>> GetCompanyName(string param)
{
    var symbolParameter = new SqlParameter("@TickerSymbol", param);
         
    var symbol= _dbContext.Database.SqlQuery<string>("p_GetCompanyInfo @TickerSymbol", symbolParameter).ToList();
}

已安装包版本:

EntityFrameworkCore 7.0.10
EntityFrameworkCore.SqlServer 7.0.10
EntityFrameworkCore.Tools 7.0.10

更新后的代码仍报错:

[ApiController]
public class QuickPicksController : ControllerBase
{
    private readonly QuickPicssContext _dbContext;
    public QuickPicksController(QuickPicssContext dbContext)
    {
        _dbContext = dbContext; 
    }

    [HttpGet("{id}")]
    public async Task<ActionResult<IEnumerable<string>>> GetStockDefs(int id)
    {
        return _dbContext.QwikPikSymbols.FromSql("EXECUTE Customers_SearchCustomers @ContactName", "TEST").ToList();
    }
}

错误原因

EF Core 7中SqlQuery和FromSql的参数传递逻辑和旧版EF不同,主要问题点:

  1. 直接传递字符串参数而非SqlParameter实例,EF Core无法识别为合法参数
  2. 异步方法中使用了同步的ToList(),且未正确匹配方法重载
  3. 调用存储过程时未明确使用EXEC/EXECUTE关键字(部分场景下会导致解析错误)

正确解决方案

方案1:使用Database.SqlQuery<T>调用存储过程

适用于返回非实体类型的场景,注意参数传递和异步方法的使用:

[HttpGet]
public async Task<ActionResult<IEnumerable<string>>> GetCompanyName(string param)
{
    var symbolParam = new SqlParameter("@TickerSymbol", param);
    // 明确使用EXEC关键字,参数用SqlParameter传递,异步用ToListAsync()
    var symbols = await _dbContext.Database.SqlQuery<string>(
        "EXEC p_GetCompanyInfo @TickerSymbol",
        symbolParam
    ).ToListAsync();

    return symbols;
}

方案2:使用DbSet.FromSql调用存储过程

如果存储过程返回结果对应已定义的实体(如QwikPikSymbols),需保证实体属性和返回列名匹配,同时用SqlParameter传递参数:

[HttpGet("{id}")]
public async Task<ActionResult<IEnumerable<QwikPikSymbols>>> GetStockDefs(int id)
{
    var contactNameParam = new SqlParameter("@ContactName", "TEST");
    var stockDefs = await _dbContext.QwikPikSymbols
        .FromSql($"EXECUTE Customers_SearchCustomers @ContactName", contactNameParam)
        .ToListAsync();

    return stockDefs;
}

关键注意事项

  • 必须使用SqlParameter传递参数,既避免SQL注入,也能让EF Core正确识别参数重载
  • 异步Action中务必使用ToListAsync()等异步方法,不要混用同步操作
  • 调用存储过程时建议明确加上EXEC或EXECUTE关键字,避免EF Core解析SQL时出错
  • 确保泛型类型(或实体属性)和存储过程返回的结果列完全匹配,否则会出现映射错误

内容的提问来源于stack exchange,提问作者baruti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:39