2011-09-07 18 views
0

我想在另一列上排序時從表中選擇不同的值列表。NHibernate 3 - 類型安全的方式來選擇一個不同的值列表

到目前爲止,我工作的唯一東西是使用魔法字符串和對象數組。任何更好的(類型安全的)方式?

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(); 

順便說一句,使用LINQ這樣做是行不通的,必須選擇FolderOrder否則你會得到一個SQL錯誤(ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

,然後做,給出了一個已知的錯誤:Expression type 'NhDistinctExpression' is not supported by this SelectClauseVisitor.關於使用匿名類型具有鮮明

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

日e object []事情是不可避免的,除非你定義一個特殊的類/結構來保存FolderNameFolderOrder
看到這個偉大的introduction to QueryOver類型安全,這是最肯定的支持。
祝你好運。

相關問題