整数列表和 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
:假设您的 Patients
和 Visits
树已正确构建:
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();
我对 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
:假设您的 Patients
和 Visits
树已正确构建:
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();