Сортировка строковой даты из списка разных данных - PullRequest
0 голосов
/ 14 мая 2019

У меня есть список из базы данных, и я хочу отсортировать переменную DateofCreation из этого списка. Тип данных в строке.

Как мне это сделать?

Я делал то, что было указано на этом сайте здесь

и исправил его, чтобы он соответствовал моему коду, ошибка

Error CS0834 A lambda expression with a statement body cannot be converted to an expression tree

var orderedList3 = collectionRecords.OrderByDescending(x =>
{
      DateTime dt;
      if (!DateTime.TryParse(x.DateOfCreation, out dt)) return DateTime.MaxValue;
      return dt;
});

collectionRecords происходит от

public class CollectionRecords
{
    [Key]
    ...
    ...
    public string AuthorSource { get; set; }
    public string DateOfCreation { get; set; }
    public string VolumeIssueNo { get; set; }
    ...
}

Пример ввода:

  • бессрочные
  • 1991 8 мая
  • март 2012
  • различные даты
  • 8 апреля 2018

Ожидаемый результат:

  • 8 апреля 2018
  • март 2012
  • 1991 8 мая
  • различные даты
  • бессрочные

Ответы [ 3 ]

0 голосов
/ 14 мая 2019

Вы можете реализовать интерфейс IComparable и метод переопределения CompareTo, чтобы определить порядок сортировки по умолчанию.

0 голосов
/ 14 мая 2019

Возможно, вам следует послушать, как другие люди комментируют структуру базы данных, но чтобы обойти ошибку expression tree, вы можете сначала выполнить оператор в БД:

var orderedList3 = collectionRecords.ToList().OrderByDescending(x =>
{
      DateTime dt;
      if (!DateTime.TryParse(x.DateOfCreation, out dt)) return DateTime.MaxValue;
      return dt;
});

В будущем Не стоит иметь это вообще особенно если у вас есть больше данных.

0 голосов
/ 14 мая 2019

Во-первых, вы не должны использовать строки в качестве дат, поэтому в конечном итоге вам придется сначала преобразовать их в DateTime перед оформлением заказа. Если вам когда-либо понадобится сохранить дату, сохраните ее как дату, а не как строку.

Ожидаемое значение также неверно, как кажется. Если я запускаю ваш код через LinqPad, я получаю правильный вывод 8 апреля 2018 март 2012 8 мая 1991 различные даты без даты

, но для этого требуется DateTime.MinValue, а не значение Max.

Также я получаю тот же вывод в VS. Каков контекст collectionRecords? Это может быть IQuerable? Я думаю, что если вы попытаетесь преобразовать его в массив или IEnumerable перед упорядочением, он должен работать как шарм.

ОБНОВЛЕНИЕ: Как вы храните его в базе данных? как строка или как дата? Создайте миграцию в базу данных и сохраните ее как дату, если только вам не требуется специально сохранять их как строки и хранить такие значения, как «различные даты» или «Undated», что немного неправильно, поскольку вы нарушаете концепцию DateTime , Вы не должны хранить что-либо еще в полях базы данных DateTime или хранить поля типа DateTime в столбцах типа string / vrchar. Лучше иметь два отдельных столбца в базе данных, например: столбец типа Datetime, который хранит только даты и имеет столбец логического типа, например «IsUdated».

Конечно, все зависит от программного обеспечения, с которым вы работаете, если вы можете внести эти изменения, в противном случае вам нужно делать то, что вы уже делаете, просто убедитесь, что типы, которые вы используете для выражения, правильные, а не IQuerable, но список или IEnumerable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...