NHibernate CreateCriteria не работает правильно с ассоциацией и датами - PullRequest
1 голос
/ 05 декабря 2010

Я пытаюсь создать ассоциацию для загрузки списка родительских объектов на основе поля даты дочерних объектов. Я хочу только родительские объекты, где дата> = заданная дата.

Проблема в том, что когда я использую либо сегодняшнюю дату, либо предыдущую, она возвращает правильных потомков. Но если я использую дату позже, например, 11-2-2010, это касается детей, у которых дата <11-2-2010. </p>

Вот код:

public IList<Parent> GetByDate(string parentId, DateTime date) {
  IList<Parent> list = null;
  using (ISession session = SessionFactory.OpenSession()) {
    list = session.CreateCriteria(typeof(Parent))
                      .Add(Expression.Eq("parent_id", parentId))
                      .CreateCriteria("children")
                        .Add(Expression.Gt("end_date", date)).List<Parent>();
  }
  return list;
} 

и отображение для Родителя:

<id name="id">
  <generator class="native"/>
</id>

<property name="parent_id" />

<bag name="children" lazy="false">
  <key column="parent_id" />
  <one-to-many class="Child" />
</bag>

Заранее спасибо!

1 Ответ

1 голос
/ 05 декабря 2010

Добавление ограничений к критериям будет не влиять на то, какие дети загружены, только на каких родителей (что не имеет смысла в вашем случае, потому что у вас уже есть parentId; используйте ISession.Get)

Если вам нужно отфильтровать дочернюю коллекцию, используйте ISession.CreateFilter.

Пример:

var parent = session.Get<Parent>(parentId);
var children = session.CreateFilter(parent.children, "where end_date > :date")
                      .SetParameter("date", date)
                      .List<Children>();

Это предполагает, что свойство, по которому вы фильтруете, называется end_date, которое не соответствует соглашениям именования .Net, но является тем, что вы написали.

...