2016-10-24 2 views
2

implementieren. Wie der Titel beschreibt, tritt ein Fehler auf, nachdem order by verwendet wurde.Mindestens ein Objekt muss IComparable Auftrag von

Der Auftrag von statment sieht wie folgt aus:

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

Datum ist immer das aktuelle Datum.

Ich versuche zu Startzeit eines Dienstes zu bestellen. Soweit ich den Fehler occasions gefunden habe, weil mein Statement einen Objekttyp zurückgibt und Objekt IComparable nicht implementiert. Der Punkt, den ich nicht verstanden habe, ist, dass ich versuche, eine dateTime und nicht einen Objekttyp zu sortieren.

+0

Ich denke, dass Sie eine schließende Klammer zu einem bestimmten Zeitpunkt fehlt. Sie bestellen gerade mit einer Linq-Abfrage (Select usw.). – Kilazur

+0

Ich habe die Klammer mit hoher Beleuchtung nachgeschlagen und sie sind an der richtigen Stelle. Zuerst führe ich einen Lambda-Ausdruck aus, wähle dann eine Liste und verwende eine Funktion, die im Typ der Liste definiert ist. Die Funktion gibt die gültige Version für diese Liste zurück.Danach eine Liste in der Version auswählen und die Startzeiten auswählen, die bestellt werden sollen – venter

Antwort

1

Select kehrt IEnumarable

Vielleicht, Sie erste Element auswählen können Sie Ihre Liste zu sortieren.

Ich füge hinzu FirstOrDefault;

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

Es scheint, dass Sie nicht versuchen, Ihre Sequenz von dispoLinien aufsteigend von Beginn der Fahrt zu bestellen, aber in aufsteigender Reihenfolge von Beginn Fahrt Sequenzen. Sie haben den Vergleich zwischen zwei Beginn-Fahrt-Sequenzen nicht definiert.

Um dies zu demonstrieren, habe ich Ihre schwierige OrderBy-Anweisung in kleine Schritte aufgeteilt, wobei ich den Typ jedes Teils dieser OrderBy überprüfe. Lassen Sie uns dies für das erste Element Ihrer dispoLinien tun:

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

Sie haben den Typ der linienVersion nicht angegeben, aber die zurückgegebene linienVersion hat eine Eigenschaft Fahrenen eines Typs, die IEnumerable implementiert. Mit anderen Worten: Von einem dl und einem Datum kann man eine linienVersion als eine Folge von Fahrts bekommen.

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

Also aus jedem dl extrahieren Sie eine Sammlung von Beginns of Fahrts.

Das Ergebnis ist, dass Sie Ihre Sammlung in aufsteigender Reihenfolge einer Sammlung von Beginns of Fahrs bestellen möchten.

Ich bin mir ziemlich sicher, dass dies nicht das ist, was Sie wollen. Wenn Sie Ihre dispLinien in aufsteigender Reihenfolge von Beginn Fahrts bestellen, sollten Sie für jeden dl die früheste aller Fahrts erhalten:

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 

Jetzt haben Sie Ihre dispoLinien aufsteigend von kleinsten Beginn Fahrt sortiert, was bedeutet, dass die Dispolinee mit der frühesten Abfahrt ist das erste.

GroupBy legt die Reihenfolge der Gruppen im Ergebnis nicht fest, daher ist es für OrderBy vor der Gruppierung nicht sinnvoll. Wenn Sie ein geordnetes Ergebnis wünschen, sollten Sie OrderBy nach der GroupBy

Verwandte Themen