Entity Framework .NET 6.0调用存储过程遇SqlQuery引用错误求助
解决DatabaseFacade无SqlQuery方法的错误
问题原因
SqlQuery<T>是Entity Framework 6(EF6)专属的方法,而你当前使用的是Entity Framework Core(EF Core),context.Database的类型是DatabaseFacade,EF Core中这个类型默认没有SqlQuery<T>方法,因此报出引用错误。
解决方案
根据你使用的EF Core版本,选择对应的处理方式:
1. EF Core 5.0及以上版本(推荐)
EF Core 5.0开始支持直接查询非实体类型的SqlQuery<T>扩展方法,但需要满足两个条件:
- 安装
Microsoft.EntityFrameworkCore.RelationalNuGet包 - 添加命名空间引用
using Microsoft.EntityFrameworkCore;
修改后的代码:
var allUsersAndCountry = context.Database.SqlQuery<ListTaskViewModel>( "SP_GetAllUserForCountry @UserName, @CountryID", sqlparameters.ToArray() ).ToList();
2. 通用方案(适配所有EF Core版本)
直接使用ADO.NET原生方式执行存储过程,无需依赖EF Core的特定版本:
using (var command = context.Database.GetDbConnection().CreateCommand()) { command.CommandText = "SP_GetAllUserForCountry"; command.CommandType = System.Data.CommandType.StoredProcedure; // 绑定参数 foreach (var param in sqlparameters) { var dbParam = command.CreateParameter(); dbParam.ParameterName = param.ParameterName; dbParam.Value = param.Value ?? DBNull.Value; command.Parameters.Add(dbParam); } context.Database.OpenConnection(); using (var reader = command.ExecuteReader()) { var resultList = new List<ListTaskViewModel>(); while (reader.Read()) { var model = new ListTaskViewModel(); // 手动映射列到模型属性,示例: // model.UserName = reader.IsDBNull(reader.GetOrdinal("UserName")) ? null : reader.GetString(reader.GetOrdinal("UserName")); // model.CountryID = reader.GetInt32(reader.GetOrdinal("CountryID")); resultList.Add(model); } return resultList; } }
3. 若ListTaskViewModel是实体类(对应数据库表)
如果你的ListTaskViewModel是EF Core中已注册的实体(即DbContext中有对应的DbSet<ListTaskViewModel>),可以使用FromSqlRaw方法:
// 假设DbContext中定义了public DbSet<ListTaskViewModel> ListTaskViewModels { get; set; } var allUsersAndCountry = context.ListTaskViewModels .FromSqlRaw("SP_GetAllUserForCountry @UserName, @CountryID", sqlparameters.ToArray()) .ToList();
注意事项
- 确保参数的
ParameterName与存储过程中的参数名完全一致(包括@前缀) - 使用EF Core 5+的
SqlQuery<T>时,必须确认已安装Microsoft.EntityFrameworkCore.Relational包,否则仍会报错
内容的提问来源于stack exchange,提问作者BTicaret BTicaret
相关产品推荐
相关产品推荐

