我正在處理一組返回IList的遺留DAO代碼,其中每個Hashtable表示一個動態執行的SQL查詢的行。例如,列表可能包含以下記錄/哈希表:針對哈希表列表的Linq操作?
Hashtable1:
重點:Column15,價值: 「傑克」
重點:Column16,值: 「史蒂文斯」
重點:Column18,值: 「1973年7月23日」
重點:Column25,價值: 「活動」
Hashtable2:
重點:Column15,值: 「梅蘭妮」
重點:Column16,值: 「蒂爾」
鍵:Column18,值: 「空」
重點:Column25,價值: 「無效」
Hashtable3:
重點:Column15,值: 「亨利」
重點:Column16,價值: 「黑」
重點:Column18,值:「1913年3月16日」
重點: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。」
我一直在努力解決這個問題幾天,接近我的智慧結束......請幫助!
完美地工作。我有一種預感,它會變得非常簡單。就像我一樣,過分複雜化一個簡單的問題。謝謝! – 2009-11-13 14:42:32
OP要降序,所以OrderByDescending將是合適的方法 – 2009-11-13 14:45:20
實際上,他真正在做的是如何對他的結果集執行操作,如分組,排序等。掛斷是如何投影每個「 HashTable「表示他之後的特定列的值。所以關鍵是把'HashTable'的每個實例都映射到那個值。其餘的只是細節。 – jason 2009-11-13 14:47:31