Во-первых, вы не должны использовать строки в качестве дат, поэтому в конечном итоге вам придется сначала преобразовать их в DateTime перед оформлением заказа. Если вам когда-либо понадобится сохранить дату, сохраните ее как дату, а не как строку.
Ожидаемое значение также неверно, как кажется. Если я запускаю ваш код через LinqPad, я получаю правильный вывод
8 апреля 2018
март 2012
8 мая 1991
различные даты
без даты
, но для этого требуется DateTime.MinValue, а не значение Max.
Также я получаю тот же вывод в VS. Каков контекст collectionRecords? Это может быть IQuerable? Я думаю, что если вы попытаетесь преобразовать его в массив или IEnumerable перед упорядочением, он должен работать как шарм.
ОБНОВЛЕНИЕ:
Как вы храните его в базе данных? как строка или как дата? Создайте миграцию в базу данных и сохраните ее как дату, если только вам не требуется специально сохранять их как строки и хранить такие значения, как «различные даты» или «Undated», что немного неправильно, поскольку вы нарушаете концепцию DateTime , Вы не должны хранить что-либо еще в полях базы данных DateTime или хранить поля типа DateTime в столбцах типа string / vrchar. Лучше иметь два отдельных столбца в базе данных, например: столбец типа Datetime, который хранит только даты и имеет столбец логического типа, например «IsUdated».
Конечно, все зависит от программного обеспечения, с которым вы работаете, если вы можете внести эти изменения, в противном случае вам нужно делать то, что вы уже делаете, просто убедитесь, что типы, которые вы используете для выражения, правильные, а не IQuerable, но список или IEnumerable.