将属性与单个值进行比较时,在多个子实体上限制fluent nhibernate queryover

将属性与单个值进行比较时,在多个子实体上限制fluent nhibernate queryover,nhibernate,fluent-nhibernate,queryover,Nhibernate,Fluent Nhibernate,Queryover,我想使用Fluent Nhibernat中的QueryOver机制限制查询。我发现我可以使用WhereRestrictOn来实现这一点,但似乎不可能只与一个值进行比较。一种等质量的方法 我举个简单的例子也许能更好地解释我的问题所在 class Parent{ IList<Child1> C1 {get;set;} IList<Child2> C2 {get;set;} } class Child1{ int Id {get;set;} } class

我想使用Fluent Nhibernat中的QueryOver机制限制查询。我发现我可以使用WhereRestrictOn来实现这一点,但似乎不可能只与一个值进行比较。一种等质量的方法

我举个简单的例子也许能更好地解释我的问题所在

class Parent{
   IList<Child1> C1 {get;set;}
   IList<Child2> C2 {get;set;}
}

class Child1{
   int Id {get;set;}
}

class Child2{
   int Id {get;set;}
}

//What I can do
var result = session.QueryOver<Parent>()
   .WhereRestrictionOn(x => x.C1.Id).IsIn(new[]{3})
   .AndRestrictionOn(x => x.C2.Id).IsIn(new[]{5}).List();

//What I would like to do
var result = session.QueryOver<Parent>()
   .WhereRestrictionOn(x => x.C1.Id).IsEqual(3)
   .AndRestrictionOn(x => x.C2.Id).IsEqual(5).List();
类父类{
IList C1{get;set;}
IList C2{get;set;}
}
一级儿童{
int Id{get;set;}
}
儿童2班{
int Id{get;set;}
}
//我能做什么
var result=session.QueryOver()
.WhereRestrictionOn(x=>x.C1.Id).IsIn(新[]{3})
.AndRestrictionOn(x=>x.C2.Id).IsIn(新[]{5}).List();
//我想做什么
var result=session.QueryOver()
.WhereRestrictionOn(x=>x.C1.Id).IsEqual(3)
.AndRestrictionOn(x=>x.C2.Id).IsEqual(5.List();
所以基本上我的问题是,我无法与一个值进行比较,但总是必须人工创建一个数组。这是不可能的还是我遗漏了什么

如果可能的话,请告诉我怎么做。如果不可能的话,请解释一下原因


提前谢谢。

我认为您需要一对子查询,而不是限制,但是您必须在
Child1
Child2
中映射ParentID值

每个子查询都应该返回ParentID,其中childID是您的搜索值,然后您可以使用连词为两个子查询返回父查询,如果没有父查询,则返回null

试试这个:

Child1 c1Alias = null;
Child2 c2Alias = null;

var result = session.QueryOver<Parent>()
   .InnerJoin(x => x.C1, () => c1Alias) // or use Left.JoinAlias
   .InnerJoin(x => x.C2, () => c2Alias) // or use Left.JoinAlias
   .Where(() => c1Alias.Id == 3)
   .And(() => c2Alias.Id == 2)
   .List();
Child1 c1Alias=null;
Child2 c2Alias=null;
var result=session.QueryOver()
.InnerJoin(x=>x.C1,()=>c1Alias)//或使用Left.JoinAlias
.InnerJoin(x=>x.C2,()=>c2Alias)//或使用Left.JoinAlias
.Where(()=>c1Alias.Id==3)
.和(()=>c2Alias.Id==2)
.List();

这会编译吗
C1
是一个
IList
并且不会有属性
Id
,除非我遗漏了什么。您可以显示您试图生成的SQL吗?