Я работаю с набором устаревшего кода DAO, который возвращает IList, где каждый Hashtable представляет строку динамически исполняемого SQL-запроса. Например, список может содержать следующие записи / хеш-таблицы:
Hashtable1:
Ключ: столбец 15, значение: «Джек»
Ключ: столбец 16, значение: "Стивенс"
Ключ: столбец 18, значение: "23.07.1973"
Ключ: столбец 25, значение: «Активно»
Hashtable2:
Ключ: столбец 15, значение: "Мелани"
Ключ: столбец 16, значение: «Чирок»
Ключ: столбец 18, значение: «ноль»
Ключ: столбец 25, значение: «Неактивно»
Hashtable3:
Ключ: столбец 15, значение: "Генри"
Ключ: столбец 16, значение: «черный»
Ключ: столбец 18, значение: "16.03.1913"
Ключ: столбец 25, значение: «Активно»
Использование статического типа вместо Hashtable не может быть и речи, поскольку результат запроса неизвестен во время выполнения; и количество столбцов, и характер этих столбцов являются полностью динамическими.
Я хотел бы иметь возможность выполнять операции над этим набором данных на основе Linq (группирование, упорядочение и т. Д.), Но я абсолютно не могу понять, как может выглядеть синтаксис. В качестве простого примера, скажем, я хочу отсортировать список по убыванию столбца 15. Лучший синтаксис, который я придумал:
var rawGridData = (List<Hashtable>) _listDao.GetListGridContents(listID, null, null);
var sortedGridData = rawGridData.OrderBy(s => s.Keys.Cast<string>().Where(k => k == "Column15"));
Однако это приводит к исключению при перечислении sortedGridData: «По крайней мере, один объект должен реализовывать IComparable».
Я боролся с этой проблемой в течение нескольких дней и близок к концу ... Пожалуйста, помогите!