Используя 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>();