【问题标题】:NHibernate getting collection within another collection during queryNHibernate 在查询期间在另一个集合中获取集合
【发布时间】:2010-02-11 19:11:39
【问题描述】:

假设我有以下类结构:

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 的状态的列表。在我的示例中,我将始终每次运行此查询时显示城市。

延迟加载显然是一种选择,但会影响性能,因为会有初始查询(日期),然后是一个查询

【问题讨论】:

    标签: .net nhibernate


    【解决方案1】:
    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>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2011-06-24
      • 2016-05-09
      • 1970-01-01
      • 2020-11-16
      • 2016-01-25
      • 2023-03-21
      相关资源
      最近更新 更多