我有一个国家/地区的域模型,如下所示(见下文)。
我想(使用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; }
}
答案 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查询,因为你读到的内容更深层次;根本没有汗水。