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