至少有一个对象必须实现IComparable order by

时间:2016-10-24 10:32:48

标签: c# linq sql-order-by

由于标题描述了使用order by后出现错误。

按照法规的顺序如下:

var fahrerGroups = dispoLinien.OrderBy(dl => dl.Linie.GetValidLinienVersionByDate(date).Fahrten.Select(f => f.Beginn)).GroupBy(dl => dl.GetValidDispolinienVersionByDate(date).Fahrer);

日期始终是当前日期。

我正在尝试按服务的开始时间排序。据我发现错误发生,因为我的statment返回一个对象类型,而对象没有实现IComparable。我不明白的一点是,我正在尝试对dateTime进行排序,而不是对象类型。

2 个答案:

答案 0 :(得分:1)

选择返回IEnumarable

也许,您可以选择第一个元素来对列表进行排序。

我添加 FirstOrDefault ;

var fahrerGroups = dispoLinien
      .OrderBy(dl => dl
         .Linie
         .GetValidLinienVersionByDate(date)
         .Fahrten
         .Select(f => f.Beginn)
         .FirstOrDefault())
      .GroupBy(dl => dl
         .GetValidDispolinienVersionByDate(date)
         .Fahrer);

答案 1 :(得分:0)

似乎你没有尝试按照Fahrt的起点的升序排序你的dispoLinien序列,而是按照Beginn Fahrt序列的升序排序。您尚未定义两个Beginn Fahrt序列之间的比较。

为了证明这一点,我将你难以理解的OrderBy语句拆分成小步骤,我检查这个OrderBy的每个部分的类型。 让我们为你的dispoLinien的第一个元素做这个:

var dl = dispoLinien.First();    var linienVersion = dl.Linie.GetValidLinienVersionByDate(date);

你还没有告诉linienVersion的类型,但返回的linienVersion有一个实现IEnumerable的类型的属性Fahrten。换句话说:从一个dl和一个日期,你可以得到一个linienVersion,作为一系列Fahrts。

IEnumerable<Fahrt> fahrten = linienVersion.Fahrten.
var fahrtBeginns = fahrten
    .Select(fahrt => fahrt.Beginn);

因此,从每个dl中,您都会提取一系列起始时间。

结果是您希望按照Beginns of Fahrts集合的升序订购您的收藏。

我很确定这不是你想要的。如果您想按照Beginn Fahrts的升序订购您的dispLinien,您应该为每个dl获得最早的Fahrts:

var orderedDispoLinien = dispoLinien.OrderBy(dispoLinie => 
    dispoLinie.Linie.GetValidLinienVersionByDate(date)
        .Fahrten                       // get only Fahrten
        .Where(fahrt => fahrt.Any()    // that are not empty
        .Select(fahrt => fahrt.Beginn) // from each fahrt take Beginn
        .Min(beginn => beginn));       // and use the earliest Beginn Fahrt

现在你按照最小的开头Fahrt的升序排序你的dispoLinien,这意味着最早的Abfahrt的dispoLinie是第一个。

GroupBy没有指定结果中组的顺序,因此在分组之前它对OrderBy没有意义。如果您想要一个有序的结果,您应该在GroupBy

之后订购