2010-07-28 56 views
1
public class City 
{ 
    virtual public long Id { get; set; } 
    virtual public string Name { get; set; } 
} 

城市表包含重複的名稱,我想刪除重複項。我也希望結果由Id排序。Nhibernate - 如何使用QueryOver獲得有序的獨特結果?

首先我想到了以下查詢。

select distinct Name from City order by Id; 

但是,如果指定了SELECT DISTINCT,那麼'ORDER BY項目必須出現在選擇列表中'。例外。看到http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx後,我覺得我應該做的:

select Name from City group by Name order by min(Id) 

所以我的問題是我怎麼能做到這一點查詢與QueryOver?

回答

4

這是可能的ICriteria:

var list = 
    session.CreateCriteria<City>() 
     .SetProjection(Projections.Group("Name")) 
     .AddOrder(Order.Asc(Projections.Min("Id"))) 
     .List<string>(); 

但這目前還不可能在QueryOver,因爲.OrderBy(IProjection)超載丟失。一旦丟失過載已經加入它應該是這個樣子:

var list = 
    s.QueryOver<City>() 
     .Select(Projections.Group<City>(p => p.Name)) 
     .OrderBy(Projections.Min<City>(c => c.Id)).Asc 
     .List<string>(); 

注意,預測重載在那裏只是現在,這樣你就可以寫的ICriteria以下(類型安全)查詢:

var list = 
    session.CreateCriteria<City>() 
     .SetProjection(Projections.Group<City>(c => c.Name)) 
     .AddOrder(Order.Asc(Projections.Min<City>(c => c.Id))) 
     .List<string>(); 
+1

FYI .OrderBy丟失的重載已被添加到主幹,並將出現在RC1中。 – FlukeFan 2010-11-07 13:38:11

+0

Hi FlukeFan =>因此,如果指定了SELECT DISTINCT,則ORDER BY項目必須出現在選擇列表中。異常應該不再出現? – landi 2014-12-18 10:25:34