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

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.Relational NuGet包
  • 添加命名空间引用
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:33:20