NHibernate的查询

问题描述:

假设过程中不被另一集合内收集我有以下类的结构: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州的列表。在我的示例中,每次运行此查询时,我都会显示城市。

延迟加载显然是一个选择,但有一个性能命中,因为会(对日)初始查询,然后一个查询

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