2009-11-13 2 views
0

Я работаю с набором устаревшего кода DAO, который возвращает IList, где каждая Hashtable представляет собой строку динамически исполняемого SQL-запроса. Например, список может содержать следующие записи/HashTables:Операции Linq против списка хэш-таблиц?

Hashtable1:
Ключ: Column15, Значение: "Jack"
Ключ: Column16, Значение: "Стивенс"
Key: Column18, значение : "7/23/1973"
Ключ: Column25, Значение: "Активный"

Hashtable2:
Ключ: Column15, Значение: "Мелани"
Ключ: Column16, Значение: "Чирок"
Ключ: Column18, Значение: "нулевой"
Key: Column25, Значение: "Неактивный"

Hashtable3:
Ключ: Column15, Значение: "Генри"
Key: Column16, Value: «Черный»
Ключ: Column18, Значение: «3/16/1913»
Ключ: Column25, Значение: «Активный»

Использование статического типа вместо 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.»

Я боролся с этой проблемой в течение нескольких дней и рядом с моим остроумием ... пожалуйста, помогите!

ответ

2

Это поможет вам начать:

var sortedGridData = rawGridData.OrderBy(r => r["Column15"]) 

Это отображает каждую «запись» к значению «Column15», а затем заказывает полученную проекцию. Это легко обобщается.

+0

Работает отлично. У меня была догадка, что это будет просто супер. Точно так же, как я слишком усложняю простую проблему. Благодаря! –

+0

OP нуждался в порядке убывания, поэтому OrderByDescending был бы подходящим методом. –

+0

Фактически, на самом деле он действительно выполнял операции с его результирующим набором, такие как группировка, сортировка и т. Д. Взаимодействие состояло в том, как проектировать каждый экземпляр ' HashTable' значение, представляющее конкретный столбец, в котором он находился. Таким образом, ключ проектирует каждый экземпляр «HashTable» для этого значения. Остальное - это просто детали. – jason

Смежные вопросы