2011-09-07 2 views
0

다른 컬럼에서 정렬하는 동안 테이블에서 다른 값 목록을 선택하려고합니다.NHibernate 3 가지 타입의 안전한 값으로 다른 값을 선택하는 방법

나를 위해 지금까지 유일하게 작동하는 것은 마법 문자열과 개체 배열을 사용합니다. 더 나은 (유형 안전) 방법? 사용에 관한 Expression type 'NhDistinctExpression' is not supported by this SelectClauseVisitor. :

var projectionList = Projections.ProjectionList(); 
    projectionList.Add(Projections.Property("FolderName")); 
    projectionList.Add(Projections.Property("FolderOrder")); 

    var list = Session.QueryOver<T>() 
    .Where(d => d.Company.Id == SharePointContextHelper.Current.CurrentCompanyId) 
    .OrderBy(t => t.FolderOrder).Asc 
    .Select(Projections.Distinct(projectionList)) 
    .List<object[]>() 
    .ToList(); 

    return list.Select(l => new Folder((string)l[0])).ToList(); 

BTW, LINQ와 함께 그 일을하면, 그렇지 않으면 당신은 SQL 오류 (ORDER BY items must appear in the select list if SELECT DISTINCT is specified. )

다음 일을 그 제공 알려진 오류가 발생합니다 FolderOrder 선택해야 작동하지 않습니다 별개의

var q = Session.Query<T>() 
    .Where(d => d.Company.Id == SharePointContextHelper.Current.CurrentCompanyId) 
    .OrderBy(d => d.FolderOrder) 
    .Select(d => new {d.FolderName, d.FolderOrder}) 
    .Distinct(); 
    return q.ToList().Select(f => new Folder(f)); 

모든 익명 유형은 농구와 일부 SQL 기본 작업을 수행하는 복잡성의 많은 ....

답변

2

유형 안전 문제를 해결하려면, 구문은 다음과 같습니다

var projectionList = Projections.ProjectionList(); 
    projectionList.Add(Projections.Property<T>(d => d.FolderName)); 
    projectionList.Add(Projections.Property<T>(d => d.FolderOrder)); 
1

일 것 같다 0 object [] 특별한 클래스/구조체를 FolderNameFolderOrder 만 보유하도록 정의하지 않는 한 것은 피할 수 없습니다.
이 위도를 참조하십시오. 가장 확실하게 지원되는 type-saftey는 introduction to QueryOver입니다.
행운을 빈다.

관련 문제