我试图将OrderBy用于嵌套属性,但我无法使其工作。
型号:
public class TPRenewalCycle
{
public virtual ICollection<TPCaseEvent> CaseEvents { get; set; }
}
public class TPCaseEvent
{
public DateTime? DueDate { get; set; }
}
方法:
List<TPRenewalCycle> cycles = renewalCycles
var nextRenewalCycle = cycles.OrderBy(cycle => cycle.CaseEvents.OrderBy(caseEvent => caseEvent.DueDate)).FirstOrDefault();
这给了我运行时错误:
至少有一个对象必须实现IComparable。
这是nullable DateTime
还是CaseEvents
?我该如何解决这个问题?
在T-SQL中,我可以这样做:
SELECT CE.DueDate
FROM TPRenewalCycles RC
INNER JOIN TPCaseEvents CE on (CE.BusinessSystemId = RC.BusinessSystemId and CE.CaseId = RC.CaseId and CE.Action = RC.Action and CE.Cycle = RC.Cycle)
Order by CE.DueDate
答案 0 :(得分:5)
由于OrderBy
表达式需要提供一个值作为整个记录的比较键,因此您需要在列表中选择最早的截止日期:
var nextRenewalCycle = cycles
.OrderBy(cycle => cycle.CaseEvents.Select(caseEvent => caseEvent.DueDate).Min())
.FirstOrDefault();
如果您正在寻找最早的日期,就像在SQL查询中一样,您可以改为使用SelectMany
:
var nextRenewalCycle = cycles
.SelectMany(cycle => cycle.CaseEvents)
.Select(caseEvent => caseEvent.DueDate)
.Min();