我正在使用一组返回IList的遗留DAO代码,其中每个Hashtable表示动态执行的SQL查询的行。例如,List可能包含以下记录/哈希表:
Hashtable1:
Key:Column15,Value:“Jack”
Key:Column16,Value:“Stevens”
关键:第18栏,价值:“7/23/1973”
键:Column25,值:“有效”
Hashtable2:
关键:第15栏,价值:“梅兰妮”
键:Column16,值:“Teal”
键:列18,值:“null”
键:Column25,值:“无效”
Hashtable3:
Key:Column15,Value:“Henry”
键:Column16,值:“黑色”
键:列18,值:“3/16/1913”
键:Column25,值:“有效”
使用静态类型而不是Hashtable是不可能的,因为查询的结果在运行时是未知的;列的数量和列的性质都是完全动态的。
我希望能够对此数据集执行基于Linq的操作(分组,排序等),但我绝对无法理解语法可能是什么样子。举个简单的例子,假设我想按Column15降序对列表进行排序。我提出的最佳语法是:
var rawGridData = (List<Hashtable>) _listDao.GetListGridContents(listID, null, null);
var sortedGridData = rawGridData.OrderBy(s => s.Keys.Cast<string>().Where(k => k == "Column15"));
但是,当枚举sortedGridData时,这会产生异常:“至少有一个对象必须实现IComparable。”
我几天来一直在努力解决这个问题,而且我的智慧已接近尾声了......请帮忙!
答案 0 :(得分:2)
这应该让你开始:
var sortedGridData = rawGridData.OrderBy(r => r["Column15"])
这会将每个“记录”映射到“Column15”中的值,然后对结果投影进行排序。这很容易推广。