2010-02-11 120 views
2

假設過程中不被另一集合內收集我有以下類的結構:NHibernate的查詢

public class State 
{ 
    public int Id { get; set; } 
    public DateTime StatehoodDate { get; set; } 
    public IList<City> CityList { get; set; } 
} 

public class City 
{ 
    public int Id { get; set; } 
    public string CityName { get; set; } 
} 

綁在NHibernate的下表:

CREATE TABLE tblState (
    StateId int, 
    StatehoodDate datetime, 
) 

CREATE TABLE tblCity { 
    CityId int, 
    StateId int, 
    CityName varchar(1000) 
} 

*注:假設在這個例子中,每個州只有5-10個城市。這是一個模糊的例子。 *

我想在1900年以後得到StatehoodDate的所有狀態。我還希望自動加載該州的城市列表,因此不需要延遲加載。如何在一個查詢中在NHibernate中查詢? (HQL,標準等無所謂 - 我會使用任何作品。)

我希望有一些方法可以在一個查詢中獲取所有數據,然後執行相同的「GROUP BY」在1900年以後只能獲得StatehoodDate州的列表。在我的示例中,每次運行此查詢時,我都會顯示城市。

延遲加載顯然是一個選擇,但有一個性能命中,因爲會(對日)初始查詢,然後一個查詢

回答

2
session.CreateCriteria<State>() 
    .SetFetchMode("CityList", NHibernate.FetchMode.Join) 
    .Add(Restrictions.Gt("StatehoodDate", new DateTime(1900,1,1))) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .List<State>(); 

這將讓你與城市名單的所有國家預加載。

如果你不希望國家實體,只是想顯示狀態&城市的數據,那麼你可以簡單地投射這些值到DTO對象,並顯示...

class CityView 
{ 
    public string StateName { get; set; } 
    public string CityName { get; set; } 
} 

session.CreateCriteria<State>() 
    .CreateAlias("CityList", "cl") 
    .Add(Restrictions.Gt("StatehoodDate", new DateTime(1900,1,1))) 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("StateName"), "StateName") 
     .Add(Projections.Property("cl.CityName"), "CityName")) 
    .SetResultTransformer(Transformers.AliasToBean<CityView>()) 
    .List<CityView>();