Запрос агрегатного объекта в NHibernate / Hibernate - PullRequest
0 голосов
/ 07 декабря 2010

У меня есть модель предметной области для стран и государств, которая выглядит следующим образом (см. Ниже).

Я хочу (с помощью Crieteria API или HQL) получить все состояния для определенной страны. Я получаю в качестве параметра CountryCode.

Из того, что я понимаю в NHibernate, я должен загрузить страну, а затем выполнить вызов во второй репозиторий с «Country Object», чтобы иметь возможность сделать 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 голосов
/ 08 декабря 2010

Должно быть довольно просто, если вы используете лямбда-расширения для ICriteria:

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

Это должно добавить правильное ограничение соединения и равенства, если отношения двух сущностей правильно отображаются в ваших HBM.

Кроме того, попробуйте Linq2NH с пространством имен NHibernate.Linq:

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

Я настраиваю запросы Linq, когда вы читаете это, что углубляется на пару уровней;нет пота.

...