ASP.NET遍历JobID数组查询数据库并返回结果到视图的实现问题
问题修复方案
你的代码存在三个核心问题:
return View(req)写在循环体内,第一次循环执行到return就会直接终止方法,后续遍历逻辑完全不会执行- 提前调用
_context.Requisitions.ToList()会把整张表的数据都加载到内存再过滤,数据量较大时性能极差 - 循环条件写为
i <= ids.Count(),会触发数组下标越界异常(数组下标从0开始,最大有效值为ids.Length - 1)
推荐最优写法
不需要手动遍历JobID数组,直接用LINQ的Contains方法完成批量筛选,EF会自动将该逻辑转换为SQL的IN语句,在数据库层面完成过滤,性能最优:
public ActionResult Index() { string[] arr = GetAgentJobId(); int[] ids = arr.Select(int.Parse).ToArray(); // 筛选逻辑直接在数据库侧执行,无需加载全表数据 var matchedRequisitions = _context.Requisitions .Where(r => r.Status == "Approved" && ids.Contains(r.JobID)) .OrderByDescending(r => r.JobID) .ToList(); return View(matchedRequisitions); }
兼容循环写法(不推荐,仅做逻辑参考)
如果你需要保留手动循环的逻辑,可以在循环外声明结果集合,每次循环将匹配结果存入集合,循环结束后再统一返回:
public ActionResult Index() { string[] arr = GetAgentJobId(); int[] ids = arr.Select(int.Parse).ToArray(); List<Requisition> Requisitions = _context.Requisitions.ToList(); // 声明总结果集合存储所有匹配数据 List<Requisition> matchedRequisitions = new List<Requisition>(); // 修正循环条件避免下标越界 for (int i = 0; i < ids.Length; i++) { var currentMatches = from r in Requisitions orderby r.JobID descending where r.Status == "Approved" && r.JobID == ids[i] select r; // 将当前批次匹配结果加入总集合 matchedRequisitions.AddRange(currentMatches); } return View(matchedRequisitions); }
内容的提问来源于stack exchange,提问作者rrpqertyu
相关产品推荐
相关产品推荐

