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

ASP.NET MVC中如何调用连接3表且带3个参数的存储过程获取数据

解决方法

原有代码问题

  • 调用SqlQuery时没有传入你定义好的参数数组,且调用时写的参数名(如@Family)和存储过程实际定义的参数名不匹配
  • 没有根据参数传入的规则,匹配对应结构的实体类接收返回结果,存储过程在不同参数下返回的字段结构完全不同,必须用对应的实体映射

前置准备

先定义三个和返回结果匹配的实体类,字段名、类型必须和存储过程SELECT返回的别名完全一致:

// 仅传入@Username时返回的结果实体
public class FamilyResult
{
    public int FamilyID { get; set; }
    public string FamilyName { get; set; }
    public int Allowed { get; set; }
}

// 传入@Username和@FamilyID时返回的结果实体
public class CategoryResult
{
    public int CategoryID { get; set; }
    public string Category { get; set; }
    public int Allowed { get; set; }
}

// 三个参数都传入时返回的结果实体
public class ReportNameResult
{
    public int ReportID { get; set; }
    public string ReportName { get; set; }
    public int Allowed { get; set; }
}

正确调用代码

根据参数值判断当前需要返回的结果类型,调用对应泛型的查询方法:

// 可根据业务场景动态调整参数值
string userName = "john";
int familyId = 0;
int categoryId = 0;

SqlParameter[] parameters = new SqlParameter[] 
{
    new SqlParameter("@UserName", userName),
    new SqlParameter("@FamilyId", familyId),
    new SqlParameter("@CategoryID", categoryId),
};

if(familyId == 0)
{
    // 返回Families数据
    var families = context.Database.SqlQuery<FamilyResult>(
        "EXEC [Report].[Rep_ReportListforUser] @UserName, @FamilyId, @CategoryID", 
        parameters
    ).ToList();
    // 可将families传递给视图
}
else if(categoryId == 0)
{
    // 返回Categories数据
    var categories = context.Database.SqlQuery<CategoryResult>(
        "EXEC [Report].[Rep_ReportListforUser] @UserName, @FamilyId, @CategoryID", 
        parameters
    ).ToList();
}
else
{
    // 返回Report Names数据
    var reportNames = context.Database.SqlQuery<ReportNameResult>(
        "EXEC [Report].[Rep_ReportListforUser] @UserName, @FamilyId, @CategoryID", 
        parameters
    ).ToList();
}

return View();

注意事项

  • 如果使用EF Core,需要将SqlQuery替换为FromSqlRaw方法,参数传递逻辑不变
  • 调用存储过程时必须加EXEC关键字,确保参数顺序和存储过程定义的顺序一致,避免参数映射错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:21:02