Построение запроса критериев NHibernate - PullRequest
0 голосов
/ 26 июня 2009

У меня проблемы с пониманием кода. У меня есть 2 класса Company и CompanyLocation. Отображается как:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Core.DataTransfer.CompanyLocation,Core.DataTransfer" table="`CompanyLocation`" lazy="true">
    <id name="CompanyLocationId" column="`CompanyLocationID`" type="int">
      <generator class="native" />
    </id>
    <many-to-one name="Company" cascade="none" column="`CompanyID`" not-null="true" />
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Core.DataTransfer.Company,Core.DataTransfer" table="`Company`" lazy="true">
    <id name="CompanyId" column="`CompanyID`" type="int">
      <generator class="native" />
    </id>
    <property type="string" not-null="true" length="100" name="CompanyName" column="`CompanyName`" />
    <bag name="CompanyLocations" inverse="true" lazy="true" cascade="all">
      <key column="`CompanyID`" />
      <one-to-many class="Core.DataTransfer.CompanyLocation,Core.DataTransfer" />
    </bag>
  </class>
</hibernate-mapping>

Я пытаюсь выполнить запрос с использованием критерия Criteria следующим образом:

        public IList<CompanyLocation> GetCompanyLocations(string sortExpression)
        {
            ICriteria criteria = _session.CreateCriteria(typeof(CompanyLocation));

            if (!string.IsNullOrEmpty(sortExpression))
            {
                Sort sort = new Sort(sortExpression);
                if (!string.IsNullOrEmpty(sort.AssociationPath))
                {
                    criteria.CreateCriteria(sort.AssociationPath).AddOrder(new Order(sort.SortColumn, sort.IsAscending));
                }
//                if (!string.IsNullOrEmpty(sort.AssociationPath))
//                {
//                    criteria.CreateCriteria(sort.AssociationPath);
//                }
//                criteria.AddOrder(new Order(sort.SortColumn, sort.IsAscending));
            }
            return criteria.List<CompanyLocation>();
        }

Когда я вызываю метод и передаю sortExpression «Company.CompanyName DESC», класс Sort проанализирует его так, чтобы: AssociationPath = "Компания" SortColumn = "CompanyName" IsAscending = false

Блок if в методе, который не закомментирован, работает. Если я перехожу на тот, который закомментирован, он завершается с: не удалось разрешить свойство: CompanyName

Мне трудно понять, почему.

1 Ответ

3 голосов
/ 27 июня 2009

Скорее всего, потому что CreateCriteria () создает новые критерии (вместо изменения исходного, как ожидает ваш код)

Попробуйте изменить на

if (!string.IsNullOrEmpty(sort.AssociationPath))
{
   var criteriaCopy = criteria.CreateCriteria(sort.AssociationPath);
}
criteriaCopy.AddOrder(new Order(sort.SortColumn, sort.IsAscending));

или просто

if (!string.IsNullOrEmpty(sort.AssociationPath))
{
   criteria = criteria.CreateCriteria(sort.AssociationPath);
}
criteria.AddOrder(new Order(sort.SortColumn, sort.IsAscending));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...