2009-11-13 2 views
0

IList를 반환하는 레거시 DAO 코드로 작업하고 있습니다. 각 Hashtable은 동적으로 실행되는 SQL 쿼리의 행을 나타냅니다.List of Hashtables에 대한 Linq 작업?

Hashtable1 : 예를 들어, 목록은 다음과 같은 기록/해시 테이블을 포함 할 수 있습니다
키 : Column15, 값 : "잭"
키 : Column16, 값 : "스티븐스"
키 : Column18, 값 "1973년 7월 23일"
키 : Column25, 값 : "활성"

Hashtable2 :
키 : Column15, 값 : "멜라니"
키 : Column16, 값 : "청록"
키 : Column18, 값 : "널 (null)"
키 : Column25, 값 :

Hashtable3 "비활성"
키 : Column15, 값 : "헨리"
키 : Column16, 값 : "블랙"
키 : Column18, 값 : "1913년 3월 16일"
키 : Column25, 값 : "활성"대신 해시 테이블의 정적 유형의

사용은 때문에 밖으로 질문 쿼리 결과는 런타임에 알 수 없습니다. 열 수와 그 열의 본질은 완전히 동적입니다.

이 데이터 세트 (그룹화, 정렬 등)에 대해 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을 구현해야합니다"

나는이 문제에 며칠 동안 고생하고 있었고 내 지혜가 거의 끝났습니다 ... 도와주세요!

답변

2

이것은 당신이 시작할 수 있어야합니다

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

이 "Column15"의 값을 각각 "레코드"를 매핑하고 그 결과 투사를 주문한다. 이것은 쉽게 일반화 될 수 있습니다.

+0

완벽하게 작동합니다. 나는 그것이 매우 단순한 무언가가 될 것 인 직감을 가지고 있었다. 나처럼 단순한 문제를 지나치게 복잡하게 만든다. 감사! –

+0

OP가 내림차순을 원했기 때문에 OrderByDescending이 적절한 메소드가되었습니다 –

+0

실제로, 그가 실제로했던 것은 그룹화, 정렬 등의 결과 세트에서 작업을 수행하는 방법이었습니다. 전화 끊기는 ' HashTable '은 그가 수행 한 특정 열을 나타내는 값입니다. 따라서 핵심은 'HashTable'의 각 인스턴스를 그 값으로 투영하는 것입니다. 나머지는 세부 사항입니다. – jason

관련 문제