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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:06