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

