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