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

EF Core 7.0替换FromSqlRaw为FromSql报错:无对应5参数重载

问题原因及解决方法

错误原因

EF Core 7.0的FromSql方法与FromSqlRaw的参数传递逻辑不同:

  • FromSqlRaw支持直接在第二个参数位置传入多个SqlParameter对象(因为它的重载是FromSqlRaw(string sql, params object[] parameters),params关键字允许传入任意数量的参数)。
  • 而FromSql没有接受「1个SQL字符串 + N个独立SqlParameter」的重载,它仅支持两种参数传递方式:使用插值字符串自动生成参数,或者将所有参数打包为一个集合(数组/列表)传入。

正确的替换方案

方案1:使用插值字符串(推荐,自动参数化,避免SQL注入)

直接在SQL字符串中使用C#插值语法,FromSql会自动将插值变量转换为参数化查询:

private CompletedViewModel GetLatestCandidateBySchoolId(RegistrationViewModel regVM)
{
    var candidate = _context.Candidates
                            .FromSql($"SELECT TOP 1 * FROM Candidates " +
                                    $"WHERE FirstName = {regVM.FirstName} AND LastName = {regVM.Surname} " +
                                    $"AND MiddleName = {regVM.MiddleName} AND DOB = {regVM.DateOfBirth}")
                            .FirstOrDefault();

    return GenerateCompletedViewModel(candidate);
}

方案2:将参数打包为集合传入

如果需要手动创建SqlParameter,可以把所有参数放到一个数组或列表中,作为第二个参数传给FromSql:

private CompletedViewModel GetLatestCandidateBySchoolId(RegistrationViewModel regVM)
{
    string sqlQuery = "SELECT TOP 1 * FROM Candidates " +
                      "WHERE FirstName = @FirstName AND LastName = @LastName " + 
                      "AND MiddleName = @MiddleName AND DOB = @DateOfBirth";

    var parameters = new[]
    {
        new SqlParameter("@FirstName", regVM.FirstName),
        new SqlParameter("@LastName", regVM.Surname),
        new SqlParameter("@MiddleName", regVM.MiddleName),
        new SqlParameter("@DateOfBirth", regVM.DateOfBirth)
    };

    var candidate = _context.Candidates
                            .FromSql(sqlQuery, parameters)
                            .FirstOrDefault();

    return GenerateCompletedViewModel(candidate);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:23:26