C# 整数列表和iQueryTable之间的LINQ连接导致c中的StackOverflow异常

C# 整数列表和iQueryTable之间的LINQ连接导致c中的StackOverflow异常,c#,linq,stack-overflow,C#,Linq,Stack Overflow,我对c比较了解,但我一直有下面概述的问题,我似乎在这里找不到解决我问题的答案 我有一个名为Visit的类,其中包含以下属性: public int VisitID { get; set; } ... public int? PatientID { get; set; } [ForeignKey("PatientID")] public virtual Patient Patient { get; set; } 还有一个相关的类,叫做pat

我对c比较了解,但我一直有下面概述的问题,我似乎在这里找不到解决我问题的答案

我有一个名为Visit的类,其中包含以下属性:

    public int VisitID { get; set; }
    ...
    public int? PatientID { get; set; }
    [ForeignKey("PatientID")]
    public virtual Patient Patient { get; set; }        
还有一个相关的类,叫做patient:

    public int PatientID { get; set; }
    ...
    public string FirstName { get; set; }
    public virtual ICollection<Visit> Visits { get; set; }
在搜索功能中,我执行LINQ查询,以获取具有特定名字的所有患者:

    var searchedPatients = patients.Where(a => a.FirstName.Contains("search string goes here"));
从这里我检索了所有名字匹配的病人:

    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命令将它们传递到我的视图中。这就是我得到StackOverflow异常的地方,我不知道为什么。这是导致异常的最后一行:

    visits = from v in visits
             join i in searchedvisitIDs on v.VisitID equals i
             select v;
    return View(visits.ToPagedList(pageNumber, pageSize));
有人能指出这一失败的正确方向吗

祝你一切顺利
Troles

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

选项A:假设您的患者和就诊树已正确构建:

var visitIds = visits.Where(i => i.Patient.FirstName.Contains(yourValue))
                     .Select(i => i.VisitID)
                     .ToList();
选项B:分别延迟加载两个列表并执行联接

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

访问次数=访问次数中的v次这可能导致您可以添加ToList以不枚举多次访问次数=访问次数中的v次。ToList…访问次数=访问次数中的v次在v上加入我在SearchedVisitID。VisitID等于我选择v;这可能需要WHERE子句?其中v.VisitID==我觉得如果没有这个,你会因为连接而得到一个庞大的集合。您可能还希望在此连接上执行WHERE操作:var visitIDResults=from vi in visions join p in searched patientids on vi.PatientID=p select new{VisitID=vi.VisitID}.ToList@艾尔达:非常感谢。这确实起了作用,但我还是不明白为什么。另外,我这样做的原因是为了避免加载整个访问列表,因为在我的第一次尝试中,加载时间很长。因此,当访问量增加时,我最终是否会冒着使用这种方法加载时间过长的风险?现在我有8000次访问,这是非常令人兴奋的。所有的best@themiDdlest:谢谢你的帮助。我无法使where子句起作用。尽管如此,我不确定我是否在跟踪你。但是,通过执行:var visitids=visits.where i=>i.Patient.FirstName==yourValue.Selecti=>i.VisitID.ToList;,获取这些VisitID不是更容易吗?您是否使用实体框架访问此数据?
var visitIds = patients.Where(i => i.FirstName.Contains(yourValue))
                       .Join(visits, 
                           i => i.PatientID,
                           j => j.PatientID,
                           (i, j) => j.VisitID)
                       .ToList();