Проблема с использованием API критериев NHibernate для получения конкретных результатов от ссылочного объекта - PullRequest
1 голос
/ 25 июня 2010

У меня есть класс с именем Показать одно из свойств "Страна" - это ссылка на другую таблицу.

Показать класс

public class Show
{
    public virtual int ID { get; set; }
    public virtual Country CountryOrigin { get; set; }
    public virtual string EnglishName { get; set; }
}

Кантри Класс

public class Country
{
    public virtual int ID { get; set; }
    public virtual string Name { get; set; }
}

У меня все это сопоставлено и работает, но сейчас я хочу получить более конкретные результаты. Я использовал критерии api, чтобы получить все данные и отсортировать их, но теперь я хочу получать шоу только по названию страны. Вот то, что я думал, что будет работать, но по существу не работает.

public IList<Show> AllShowsByCountry(string countryName)
{
    IList<Show> shows;

    shows = _session.CreateCriteria(typeof(Show))
        .Add(Restrictions.Eq("CountryOrigin.Name", "China" ))
        .AddOrder(Order.Asc("EnglishName"))
        .List<Show>();

    return shows;
}

Я думал, что первая часть ограничения может работать аналогично HQL, и вы можете использовать объекты.

1) Вопрос, который я предполагаю, состоит в том, что я неправильно понимаю, как работает HQL или критерии, или оба?
2) Кроме того, как бы вы сделали это правильно, используя критерии?

Обновление Вот ошибка, которую я получаю

could not resolve property: CountryOrigin.Name of: Entities.Show

1 Ответ

4 голосов
/ 25 июня 2010

Для критериев используйте следующее:

_session.CreateCriteria<Show>()
        .CreateAlias("CountryOrigin", "country")
        .Add(Restrictions.Eq("country.Name", countryName))
        .AddOrder(Order.Asc("EnglishName"))
        .List<Show>();

Конечно, HQL проще, когда вы не строите динамический запрос (поиск):

_session.CreateQuery(
@"
  from Show
  where CountryOrigin.Name = :countryName
  order by EnglishName
")
.SetParameter("countryName", countryName)
.List<Show>();

А Линк всегда раскачивается:

_session.Query<Show>()
        .Where(s => s.CountryOrigin.Name = countryName)
        .OrderBy(s => EnglishName)
        .ToList();

(.Query для NH 3.x; для использования 2.x .Linq)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...