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>

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

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, но является тем, что вы написали.

Другие вопросы по тегам