我正在尝试使用如下查询将两种不同类型的截止日期加入我的日程表中:
var dockets = _docektRepository.GetAll()
[some .WhereIf and .OrderBy]
.GroupJoin(_deadlineRepository.GetAll().Where(x => x.Type == "A").OrderBy(x => x.Date), x => x.Id, y => y.ID_Docket, (x, y) => new { Docket = x, DeadlineA = y.FirstOrDefault() })
.GroupJoin(_deadlineRepository.GetAll().Where(x => x.Type == "B").OrderBy(x => x.Date), x => x.Id, y => y.Docket.ID_Docket, (x, y) => new { Docket = x.Docket, DeadlineA = x.DeadlineA, DeadlineB = y.FirstOrDefault() });
截止日期上的
.FirstOrDefault()
部分很重要,因为我只需要每种类型最接近的截止日期(与.OrderBy(x => x.Date)
结合实现)。
不幸的是,这会导致“System.InvalidOperationException:无法翻译 LINQ 表达式 [...]”错误。切换到客户端评估是不可能的,因为有数千行(在后面的步骤中对查询应用了分页,但这不是这里的问题)。
仅使用两个 .GroupJoins 之一时工作正常,如下所示:
var dockets = _docektRepository.GetAll()
[some .WhereIf and .OrderBy]
.GroupJoin(_deadlineRepository.GetAll().Where(x => x.Type == "A").OrderBy(x => x.Date), x => x.Id, y => y.ID_Docket, (x, y) => new { Docket = x, DeadlineA = y.FirstOrDefault() });
我不明白为什么不能多次加入 GroupJoin,我错过了什么?或者有更好的方法来编写查询吗? 如有任何帮助,我们将不胜感激!
我建议在这里使用查询表达式语法。当查询有多个连接查询时,它会更加准确和可预测。
var docketRecords = _docektRepository.GetAll()
[some .WhereIf and .OrderBy]
;
var query =
from d in docketRecords
from dA in _deadlineRepository.GetAll()
.Where(dA => dA.Type == "A" && d.Id == dA.ID_Docket)
.OrderBy(dA => dA.Date)
.Take(1)
.DefaultIfEmpty()
from dB in _deadlineRepository.GetAll()
.Where(dB => dB.Type == "B" && d.Id == dB.ID_Docket)
.OrderBy(dB => dB.Date)
.Take(1)
.DefaultIfEmpty()
select new
{
... // your projection
};