如何归还至少包含所有预定义儿童的所有父母

时间:2015-05-04 20:30:53

标签: c# hibernate nhibernate fluent-nhibernate queryover

示例类(多对多关系):

public class Parent
{
     Guid Id;
     IList<Child> Children;
}

public class Child
{
     Guid Id;
     IList<Parent> Parents;
}

让我们考虑所有映射都已实现且工作正常。

我们在存储库中有一个方法:

public class MyRepository
{
     public IList<Parent> GetParents(IList<Child> children)
     {
          return Session.QueryOver ... ?
     }
}

使用QueryOver API,我想返回所有拥有所有孩子的父母。父母可以拥有超过定义的孩子,但必须存在已定义的孩子。

查询将如何?

1 个答案:

答案 0 :(得分:0)

NHibernate QueryOverCriteria做事方式并不那么直观(至少对我而言)。在LINQ中,您可以使用此查询来执行此操作:

return Db.Parents.Where(x => 
    x.Children.Count(c => children.Contains(c)) == children.Length);

或(更接近下面的NHibernate解决方案)

return from child in Db.Children.Where(c => children.Contains(c))
       from parent in child.Parents
       group parent by parent.Id into g
       where g.Count() == children.Length
       select g.Single();

虽然可能有更简单的方法,但我相信这样的事情应该有效:

var childIds = children.Select(c => c.Id).ToArray();
Parent parent = null;
Child child = null;

return Session
    .QueryOver.Of<Child>(() => child)
    .WhereRestrictionOn(x => x.Id).IsIn(childIds)
    .JoinQueryOver(x => x.Parents, () => parent)
    .Where(Restrictions.Eq(Projections.Count(() => parent.Id), childIds.Length))
    .Select(Projections.Group(() => parent.Id));