示例类(多对多关系):
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,我想返回所有拥有所有孩子的父母。父母可以拥有超过定义的孩子,但必须存在已定义的孩子。
查询将如何?
答案 0 :(得分:0)
NHibernate QueryOver
和Criteria
做事方式并不那么直观(至少对我而言)。在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));