LINQ. Как отсортировать по нескольким параметрам?

К списку предъявляется требование - сортировка может происходить сразу по нескольким полям. Порядок сортировочных полей заранее известен, а необходимость выполнить сортировку по конкретным полям - нет. Условно, сейчас нужна сортировка по одному полю, через некоторое время по другому полю, ещё через время по всем полям.

В приведённом ниже примере можно заметить, что если необходимо, чтобы сортировка производилась сразу по двум полям, то факт первой сортировки затрётся второй. Хотелось бы решить проблему конструкцией последовательных друг за другом ThenBy, но никак не могу додуматься до изящного решения. Наведите на мысль или приведите пример решения проблемы для данного кода.

var dataList = new List<Data>
{
    new Data(1, DateTime.Now.Date),
    new Data(0, DateTime.Now.Date),
    new Data(2, DateTime.Now.Date),
    new Data(3, DateTime.Now.Date),
    new Data(4, DateTime.Now.Date),
    new Data(5, DateTime.Now.Date),
    new Data(6, DateTime.Now.Date),
    new Data(7, DateTime.Now.Date),
    new Data(8, DateTime.Now.Date.AddDays(1)),
    new Data(9, DateTime.Now.Date.AddDays(1))
};

bool condition1 = new Random().NextBoolean();
bool condition2 = new Random().NextBoolean();

if (condition1)
    dataList = dataList.OrderBy(x => x.id).ToList();

if (condition2)
    dataList = dataList.OrderByDescending(x => x.date).ToList();

Ответы (2 шт):

Автор решения: SlavaKorol

Пришел к подобному решению:

var query = dataList.AsQueryable() as IOrderedQueryable<Data>;

SortOrder sortOrder = (SortOrder)new Random().Next(4);
switch(sortOrder)
{
    case SortOrder.IdAscending: query = query.OrderBy(x => x.id);   break;
    case SortOrder.IdDescending: query = query.OrderByDescending(x => x.id); break;
    case SortOrder.DateAscending: query = query.OrderBy(x => x.date); break;
    case SortOrder.DateDescending: query = query.OrderByDescending(x => x.date); break;
    default: query = query.OrderByDescending(x => x.date); break;
}

query = query.ThenBy(x => x.id);

Ввел промежуточную переменную IOrderedQuarable. Нагрузил её сортировкой в зависимости от условий. И после этого дополнительно задаю второстепенную сортировку.

→ Ссылка
Автор решения: Alexander Petrov

Я слегка модифицировал ваш пример, применив паттерн-матчинг.
Преобразование в Queryable не нужно.

var query = sortOrder switch
{
    SortOrder.IdAscending => dataList.OrderBy(x => x.id),
    SortOrder.IdDescending => dataList.OrderByDescending(x => x.id),
    SortOrder.DateAscending => dataList.OrderBy(x => x.date),
    SortOrder.DateDescending => dataList.OrderByDescending(x => x.date),
    _ => dataList.OrderByDescending(x => x.date)
};

query = query.ThenBy(x => x.id);
→ Ссылка