1

我正在尝试使用查询关键字将 linq 查询转换为方法语法。我的最终目标是每次在查询中看到Where子句时都能够在运行时应用附加限制。我总共有 14 个不同的参数要应用。有些是相互排斥的,有些是包容的。

这是开始的查询:

query = from p in context.Person
where p.Firstname.ToUpper().StartsWith(firstName.ToUpper())
join v in context.Visit on p.Id equals v.PersonId
where !v.AccessionNumber.StartsWith(RISConst.PM_PREFIX)
join f in context.Finding on v.Id equals f.VisitId
join c in context.Consultation on f.Id equals c.FindingId
where c.StudyId.ToUpper().CompareTo(studyId.ToUpper()) == 0
select v;

使用 Jon Skeet 的优秀博客文章,我已经能够做到这一点:

query = context.Person.Where(p => p.Firstname.ToUpper().StartsWith(firstName.ToUpper()))
.Join(context.Visit, p => p.Id, v => v.Id, (p, v) => new { p, v })
.Where(z => z.v.AccessionNumber.StartsWith(RISConst.PM_PREFIX))
.Select(z => z.v)
.Join(context.Finding, v => v.Id, f => f.VisitId, (v, f) => new { v, f })
.Select(t => t.f)
.Join(context.Consultation, f => f.Id, c => c.FindingId, (f, c) => new { f, c })
.Where( u => u.c.StudyId.ToUpper().CompareTo(studyId.ToUpper()) == 0)
.Select(????);

现在我被困住了,因为我需要回访。我怎样才能做到这一点 ?

任何帮助表示赞赏。

4

1 回答 1

2

我认为你迷失Visists了这个选择声明:.Select(t => t.f). 删除它并在下一条语句中使用整个匿名对象。

.Join(context.Consultation, x => x.f.Id, c => c.FindingId, (x, c) => new { x.v, c })
.Where( u => u.c.StudyId.ToUpper().CompareTo(studyId.ToUpper()) == 0)
.Select(u => u.v);
于 2012-10-30T17:43:14.523 回答