使用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>();
答案 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();