Найти все родительские сущности NHibernate, где дочерняя сущность HasMany соответствует критериям - PullRequest
1 голос
/ 11 февраля 2012

Используя Nhibernate и Fluent NHibernate для отображения, у меня есть родительский объект с отношением один ко многим к дочернему объекту.

В родительском объекте я могу перечислить всех дочерних элементов, прикрепленных в

this.HasMany<Child>(x => x.Child).KeyColumn("ParentID").Cascade.None();

Дочерняя сущность имеет свойство даты начала и окончания.Я хотел бы выбрать всех родителей, у которых есть дети, где Child.BeginDate >= DateTime.Now && Child.EndDate < DateTime.Now.

Я бился головой о том, как этого добиться с помощью NHibernate.

Это явно не сработало, но мойПервая попытка была такой:

s.CreateCriteria<Parent>()
    .Add(Expression.Where<Parent>(x => x.Children.Where<Child>(y => y.BeginDate <= DateTime.Now && y.EndDate > DateTime.Now).Count() > 0))
    .List<Parent>();

Я мог бы выполнить с T-SQL, как это;

SELECT p.* FROM dbo.ParentTable p
WHERE (SELECT COUNT(*) FROM dbo.ChildTable c WHERE p.ID = c.ParentID AND c.BeginDate <= GETDATE() AND c.EndDate > GETDATE()) > 0

Успех!

s.CreateCriteria<Parent>()
    .CreateAlias("Child", "Child")
    .Add(Restrictions.Le("Child.BeginDate", DateTime.Now))
    .Add(Restrictions.Gt("Child.EndDate", DateTime.Now))
    .SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer())
    .List<Parent>();

1 Ответ

1 голос
/ 11 февраля 2012

Посмотрите, работает ли это для вас:

var criteria = Session.QueryOver<Parent>();
criteria.JoinQueryOver<Child>(x => x.Children)
        .Where(y => (y.BeginDate <= DateTime.Now) && (y.EndDate > DateTime.Now));

criteria.TransformUsing(Transformers.DistinctRootEntity);
return criteria.List();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...