C#中foreach循环后如何将查询得到的列表返回给View视图
问题核心原因
- 变量作用域错误:
res在foreach循环内部声明,仅在单次循环迭代内有效,循环外部无法访问,因此编译时报找不到变量的错误。 - 逻辑漏洞:即使把
res移到循环外声明,现有写法每次循环都会覆盖res的取值,最终仅会保留最后一次循环的查询结果,无法收集所有匹配的文档。
修复后的可运行代码
在循环外提前声明存储所有文档的总列表,每次循环将匹配的文档追加到总列表中即可,同时补充了常见的空引用防护逻辑:
public ActionResult userDocs() { // 防护:Cookie不存在时跳转到登录 if (Request.Cookies["UserName"] == null) { return RedirectToAction("Login"); } var user = Server.HtmlEncode(Request.Cookies["UserName"].Value); var userDetail = db.userdetails.FirstOrDefault(s => s.UserName == user); // 防护:未查到对应用户时返回空列表 if (userDetail == null) { return View(new List<docinfo>()); } var role = userDetail.FullName; var test = "kokulchellamuthu1programmer"; var find = db.ApplySchedule.Where(x => x.CC.Contains(test)).ToList(); // 声明总列表存储所有匹配文档 List<docinfo> allRes = new List<docinfo>(); foreach(var i in find) { var res = db.docinfo.Where(z => z.RequestID == i.BookingID).ToList(); // 追加当前循环查到的文档到总列表 allRes.AddRange(res); } return View(allRes); }
推荐优化写法
可以直接用LINQ的SelectMany方法一次性完成关联查询,避免在循环中多次访问数据库,性能更好,代码更简洁:
public ActionResult userDocs() { if (Request.Cookies["UserName"] == null) { return RedirectToAction("Login"); } var user = Server.HtmlEncode(Request.Cookies["UserName"].Value); var userDetail = db.userdetails.FirstOrDefault(s => s.UserName == user); if (userDetail == null) { return View(new List<docinfo>()); } var test = "kokulchellamuthu1programmer"; var allRes = db.ApplySchedule .Where(x => x.CC.Contains(test)) .SelectMany(i => db.docinfo.Where(z => z.RequestID == i.BookingID)) .ToList(); return View(allRes); }
内容的提问来源于stack exchange,提问作者Ashwin
相关产品推荐
相关产品推荐

