查找HasMany子实体符合条件的所有NHibernate父实体

时间:2012-02-10 20:08:50

标签: nhibernate fluent-nhibernate

使用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 个答案:

答案 0 :(得分:1)

看看这是否适合你:

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();