假设我有以下类结构:
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状态的列表。在我的示例中,我将永远每次运行此查询时显示城市。
延迟加载显然是一个选项,但是会有性能损失,因为会有初始查询(在日期)然后一个查询
答案 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>();