OrderBy嵌套属性

时间:2018-04-17 12:44:25

标签: c# linq lambda

我试图将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

1 个答案:

答案 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();