Сортировать время и дату

Рейтинг: 0Ответов: 1Опубликовано: 06.04.2023
... .OrderByDescending(day => day.DEN).ThenBy(hours => hours.CAS);

json беру из бд sql, чтоб показать в приложении. в базе данных два поля сохранены по отдельности и также в таблице показываю расписание с двумя полями, время и дата, необходимо сортировать расписание, чтоб на сегодня показывал все с утра и до вечера, а когда таблица показывает расписание вчерашнего дня (все еще в той же таблице), чтоб было с вечера и к утру, СОРТИРОВКА ПО ВОЗРАСТАНИЮ тоесть при таком запросе у меня выходит на сегодняшний день все как и ожидаю, то есть 9, 10, 11 итд, а на второй день пишет тоже самое в графе день вчера-ок, а графа часа как на сегодня 9,10,11..., как можно вчерашний и более ранние дни сделать наоборот, тоесть 18.00, 17.00, 16.00 то есть, чтоб было по возрастанию по двум полям сортировка ?

вот что я вижу

введите сюда описание изображения

... .OrderByDescending(day => day.DEN).ThenByDescending(hours => hours.CAS);

введите сюда описание изображения

... .OrderBy(day => day.DEN).ThenByDescending(hours => hours.CAS);

введите сюда описание изображения

а надо на сегодня как есть с утра, а вчера с вечера

blazor web assembly C#

Ответы

▲ 1Принят

Первое, что на ум приходит - разделить список на два сегмента: текущий день и все остальное.

int day = dateList.Select(day => day.DEN).Max();
IEnumerable<...> first = dateList.Where(day => day.DEN.Equals(day));
IEnumerable<...> other = dateList.Where(day => !day.DEN.Equals(day));

Потом сортировать их по отдельности как нужно и обратно объединить:

first = first.OrderByDescending(hours => hours.CAS);
other = other.OrderByDescending(day => day.DEN).ThenBy(hours => hours.CAS);
IEnumerable<...> sorted = first.Concat(other);

Пример работы (Консоль .NET 6):

List<dateClass> dateList = new List<dateClass>()
{
  new dateClass(){ DAY = 03, HOUR = 18 },
  new dateClass(){ DAY = 04, HOUR = 18 },
  new dateClass(){ DAY = 04, HOUR = 16 },
  new dateClass(){ DAY = 03, HOUR = 17 },
  new dateClass(){ DAY = 03, HOUR = 16 },
  new dateClass(){ DAY = 04, HOUR = 17 }
};

int day = dateList.Select(x => x.DAY).Max();
IEnumerable<dateClass> first = dateList.Where(x => x.DAY.Equals(day));
IEnumerable<dateClass> other = dateList.Where(x => !x.DAY.Equals(day));
first = first.OrderByDescending(x => x.HOUR);
other = other.OrderByDescending(x => x.DAY).ThenBy(x => x.HOUR);
IEnumerable<dateClass> sorted = first.Concat(other);
Console.WriteLine(string.Join(Environment.NewLine, sorted.Select(x => x.DAY.ToString() + ": " + x.HOUR.ToString())));

class dateClass
{
  public int DAY { get; set; }
  public int HOUR { get; set; }
}

Выводит:

введите сюда описание изображения


Еще как вариант добавить столбцы нумерации из базы SQL. Например разные сортировки ROW_NUMBER() от DENSE_RANK() по дате:

SELECT
  [t],
  CASE
    WHEN [t] = 1
    THEN ROW_NUMBER() OVER (PARTITION BY [b] ORDER BY [a] DESC)
    ELSE ROW_NUMBER() OVER (PARTITION BY [b] ORDER BY [a])
  END AS [N],
  [b],
  [a]
FROM
  (
    SELECT
      DENSE_RANK() OVER (ORDER BY [b] DESC) AS [t],
      [b],
      [a]
    FROM
      (
        SELECT
          CONVERT([date], [a]) AS [b],
          [a]
        FROM
          (
            SELECT CONVERT([datetime], '2023-04-05 18:25:43', 120) AS [a]
            UNION ALL
            SELECT CONVERT([datetime], '2023-04-07 18:04:43', 120)
            UNION ALL
            SELECT CONVERT([datetime], '2023-04-07 18:25:00', 120)
            UNION ALL
            SELECT CONVERT([datetime], '2023-04-07 17:14:12', 120)
            UNION ALL
            SELECT CONVERT([datetime], '2023-04-06 18:11:11', 120)
            UNION ALL
            SELECT CONVERT([datetime], '2023-04-06 16:01:35', 120)
            UNION ALL
            SELECT CONVERT([datetime], '2023-04-06 17:45:52', 120)
          ) t
      ) t2
  ) t3
ORDER BY
  [t],
  [N]
t N b a
1 1 2023-04-07 2023-04-07 18:25:00.000
1 2 2023-04-07 2023-04-07 18:04:43.000
1 3 2023-04-07 2023-04-07 17:14:12.000
2 1 2023-04-06 2023-04-06 16:01:35.000
2 2 2023-04-06 2023-04-06 17:45:52.000
2 3 2023-04-06 2023-04-06 18:11:11.000
3 1 2023-04-05 2023-04-05 18:25:43.000