2011-04-27 65 views
0

我創建了一個流暢的NHibernate約定,將'Join'設置爲所有多對一關聯的獲取模式(在我看來,發送選擇時每個獲取1條記錄都沒有意義)。問題是一些實體有大量的列(遺留數據庫),我需要限制我創建的報告的結果集。NHibernate - 如何使用投影與關聯路徑來限制結果集?

請看下面的例子:

class X 
{ 
    public int Id {get;set;} 
    public virtual Y RefToY {get;set;} 
    ... 
} 

class Y 
{ 
    public int Id {get;set;} 
    public virtual Z RefToZ {get;set;} 
    ... 
} 

class Z 
{ 
    public int Id {get;set;} 
    public virtual String data1 {get;set;} 
    public virtual String data2 {get;set;} 
    public virtual String data3 {get;set;} 
    ... 
} 

試想一下,除了我表現出的屬性,這些實體有200多個屬性,每個屬性映射成一列。假設我需要創建的報表基於X(意味着標準根植於X),我需要獲取X的'Id'屬性和Z的'data1','data2'和'data3'屬性顯示在DataGrid上。 用600列取結果集沒有意義,所以我需要使用Criteria API來指定我只需要那4列。我怎樣才能快速實現這一目標?我曾嘗試設置這樣的預測:

var crit = Session.CreateCriteria<X>().SetProjection(Projections.ProjectionList() 
.Add(Projections.Property("Id")) 
.Add(Projections.Property("RefToY.RefToZ.data1")) 
.Add(Projections.Property("RefToY.RefToZ.data2")) 
.Add(Projections.Property("RefToY.RefToZ.data3"))); 

,但是這導致的錯誤說:「RefToY.RefToZ.data1」 ...的屬性並不存在。這導致了我的問題。我如何使用NHibernate標準API來實現這一點?

回答

4

您需要爲條件添加連接。試試這個...

var crit = Session.CreateCriteria<X>() 
    .CreateAlias("RefToY", "y") 
    .CreateAlias("y.RefToZ", "z") 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("Id")) 
     .Add(Projections.Property("z.data1")) 
     .Add(Projections.Property("z.data2")) 
     .Add(Projections.Property("z.data3")));