0

我有一个国家和州的领域模型,如下所示(见下文)。

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

根据我在 NHibernate 中的理解,我必须加载国家,然后使用“国家对象”向我的第二个存储库发出调用,以便能够在我的 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; }
 }
4

1 回答 1

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 查询,这会更深入一些;一点汗都没有。

于 2010-12-07T21:01:24.593 回答