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
相关产品推荐
相关产品推荐

