Сортировать время и дату
... .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 |



