NHibernate在查询期间在另一个集合中获取集合

时间:2010-02-11 19:11:40

标签: .net 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,Criteria等并不重要 - 我将使用任何有效的方法。)

我希望有一些方法可以在一个查询中获取所有数据,然后执行相当于“GROUP BY”的操作,以获得1900年后仅有StatehoodDate状态的列表。在我的示例中,我将永远每次运行此查询时显示城市。

延迟加载显然是一个选项,但是会有性能损失,因为会有初始查询(在日期)然后一个查询

1 个答案:

答案 0 :(得分:2)

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

这将为您提供所有预先加载城市列表的州。

如果您不想要状态实体,只想显示状态&amp;城市数据然后你可以简单地将这些值投影到一个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>();