2016-10-24 2 views
2

Как заголовок описывает ошибку, возникает после использования order by.Как минимум один объект должен реализовать IComparable order by

Порядок по даного выглядит следующим образом:

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

Дата всегда текущая дата.

Я пытаюсь заказать по времени начала службы. Насколько я выяснил, ошибка возникает, потому что мой статус возвращает тип объекта, а объект не реализует IComparable. То, что я не понял, это то, что я пытаюсь сортировать dateTime, а не тип объекта.

+0

Я думаю, что в какой-то момент вам не хватает закрывающей скобки. Прямо сейчас вы заказываете запрос Linq (выберите и т. Д.). – Kilazur

+0

Я просматриваю круглые скобки с высоким освещением, и они находятся в нужном месте. Сначала я выполняю лямбда-выражение, затем выбираю список и использую функцию, определенную в типе списка. Функция возвращает версию vaild для этого списка.После этого выберите список в версии и выберите время начала, которое должно быть заказано. – venter

ответ

1

Select возвращает IEnumarable

Может быть, вы можете выбрать первый элемент для сортировки списка.

Я добавляю FirstOrDefault;

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

Кажется, вы не пытаетесь заказать последовательность dispoLinien в порядке возрастания Beginn из Fahrt, но в порядке возрастания Beginn Fahrt последовательностей. Вы не определили сравнение двух последовательностей Beginn Fahrt.

Чтобы продемонстрировать это, я разделил ваше сложное утверждение OrderBy на небольшие шаги, где я проверяю тип каждой части этого OrderBy. Давайте сделаем это для первого элемента вашего dispoLinien:

var dl = dispoLinien.First(); var linienVersion = dl.Linie.GetValidLinienVersionByDate (дата);

Вы не сказали тип linienVersion, но возвращаемая linienVersion имеет свойство Fahrten типа, реализующего IEnumerable. Другими словами: из dl и даты вы можете получить linienVersion, что в качестве последовательности Fahrts.

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

Таким образом, с каждого dl вы извлекаете коллекцию Beginns of Fahrts.

В результате вы хотите заказать свою коллекцию по возрастанию коллекции Beginns of Fahrts.

Я уверен, что это не то, что вы хотите. Если вы хотите заказать dispLinien в порядке возрастания Beginn Fahrts, вы должны для каждого дл получить самый ранний из всех 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 

Теперь вы отсортировали ваш dispoLinien в порядке возрастания наименьшего Beginn Fahrt, а это означает, что сначала будет дислоцирование с самым ранним Абфахртом.

GroupBy не определяет порядок групп в результате, поэтому он не имеет смысла для OrderBy перед Группировкой. Если вы хотите получить заказываемый результат, вы должны заказать его после GroupBy

Смежные вопросы