NHibernate CreateCriteria неправильно работает с ассоциацией и датами

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

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

Вот код:

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>

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


person chipman    schedule 04.12.2010    source источник


Ответы (1)


Добавление ограничений к критериям не повлияет на то, какие дочерние элементы загружаются, а только на родительские (что не имеет смысла в вашем случае, поскольку у вас уже есть 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, но это то, что вы написали.

person Diego Mijelshon    schedule 05.12.2010
comment
есть ли шанс, что вы можете привести пример, используя мой код\отображение? Кажется, я понимаю, о чем ты говоришь, но примером может служить kewl. - person chipman; 05.12.2010