整数列表和 IQueryable 之间的 LINQ 连接导致 c# 中的堆栈溢出异常

LINQ join between List of integers and IQueryble causes StackOverflow Exception in c#

我对 c# 比较了解,但我一直遇到下面概述的问题,而且我似乎无法在 SO 找到解决我问题的答案。

我有一个名为 Visit 的 class,其中包含以下属性(以及其他属性):

    public int VisitID { get; set; }
    ...
    public int? PatientID { get; set; }
    [ForeignKey("PatientID")]
    public virtual Patient Patient { get; set; }        

还有一位相关的 class 患者:

    public int PatientID { get; set; }
    ...
    public string FirstName { get; set; }
    public virtual ICollection<Visit> Visits { get; set; }

我执行 LINQ 查询来检索所有就诊和患者:

    var visits = db.Visits;
    var patients = db.Patients;

在搜索功能中,我执行 LINQ 查询以获取具有特定名字的所有患者:

    var searchedPatients = patients.Where(a => a.FirstName.Contains("search string goes here"));

从这里我检索了所有具有匹配名字的 PatientIDs:

    searchedPatients.Select(v => v.PatientID).ToList().ForEach(x => searchedPatientIDs.Add(x));

然后我需要检索具有该特定名字的患者的所有 VisitID,如下所示:

     var visitIDResults = (from vi in visits
                           join p in searchedPatientIDs on vi.PatientID equals p
                           select new { VisitID = vi.VisitID }).ToList();
     visitIDResults.Select(v => v.VisitID).ToList().ForEach(x => searchedVisitIDs.Add(x));

这给了我一个包含所有 VisitID 的整数列表(目前有 8000 多个不同的 VisitID)。最后,我需要使用这些 VisitID 检索所有访问,并通过 .ToPagedList 命令将它们传递到我的视图中。这是我得到 Whosebug 异常的地方,我不知道为什么。导致异常的是最后一行:

    visits = from v in visits
             join i in searchedvisitIDs on v.VisitID equals i
             select v;
    return View(visits.ToPagedList(pageNumber, pageSize));

任何人都可以指出正确的方向来说明失败的原因吗?

祝一切顺利 特罗尔斯

正如@Eldar 在评论中建议的那样,为了避免多次枚举,您需要在 IEnumerable 上调用 ToList()。另外,我认为您的查询可以简化。

Option A:假设您的 PatientsVisits 树已正确构建:

var visitIds = visits.Where(i => i.Patient.FirstName.Contains(yourValue))
                     .Select(i => i.VisitID)
                     .ToList();

Option B:分别延迟加载两个列表并执行连接

var visitIds = patients.Where(i => i.FirstName.Contains(yourValue))
                       .Join(visits, 
                           i => i.PatientID,
                           j => j.PatientID,
                           (i, j) => j.VisitID)
                       .ToList();