在NHibernate / Hibernate中查询聚合对象

时间:2010-12-07 20:23:21

标签: c# nhibernate nhibernate-criteria

我有一个国家/地区的域模型,如下所示(见下文)。

我想(使用Crieteria API或HQL)获取特定国家/地区的所有州。我收到CountryCode作为参数。

根据我在NHibernate中的理解,我必须加载该国家,然后使用“Country Object”向我的第二个存储库发出调用,以便能够在我的crieria中创建Expression.Eq()。有没有办法获取特定国家/地区的所有州,因此,使用单个查询?我只想做一个简单的SQL内连接,然后在国家代码上添加一个约束。

我确定它与投影有关,但我发现的唯一例子是单个模型,并展示了如何使用不是我打算做的聚合函数。

非常感谢你的帮助!

我当前的存储库调用如下所示:

 public IList<Model.StateProvinces> LoadStateProvincesForAutocomplete(string partialName, string countryCode)
 {
    CountryRepository countryRepo = new CountryRepository();
    Model.Country currentCountry = countryRepo.Get(countryCode);


    return
    _session.CreateCriteria<Model.StateProvince>()
        .Add(Expression.Eq("Country", currentCountry))
        .Add(Expression.Like("Name", partialName, MatchMode.Anywhere))
        .List<Model.StateProvince>();
 }

我的模型定义如下:

public class Country
{
   public virtual int Id { get; set; }
   public virtual string Code { get; set; }
   public virtual string NameEn { get; set; }
   public virtual string NameFr { get; set; }
   public virtual List<Model.StateProvince> StateProvinces { get; set; }
}

public class StateProvince
{
        public virtual Country Country { get; set; }
        public virtual int Id { get; set; }
        public virtual string Code { get; set; }
        public virtual string NameEn { get; set; }
        public virtual string NameFr { get; set; }
 }

1 个答案:

答案 0 :(得分:0)

如果你使用对ICriteria的lambda扩展,那应该非常简单:

session.CreateCriteria<StateProvince>().Add(s=>s.Country.NameEn == "United States").List();

只要在HBM中正确映射了两个实体的关系,就应该添加正确的连接和等式约束。

另外,尝试使用NHibernate.Linq命名空间Linq2NH:

session.Linq<StateProvince>().Where(s=>s.Country.NameEn == "United States").ToList();

我正在设置Linq查询,因为你读到的内容更深层次;根本没有汗水。