我想使用Fluent Nhibernat中的QueryOver机制来限制查询。我发现我可以使用WhereRestrictOn来做到这一点,但似乎没有可能只与一个值进行比较。一种IsEqual方法。
我的例子可以更好地解释我的问题是什么
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();
所以基本上我的问题是我无法与一个值进行比较,但总是必须人为地创建一个数组。这是不可能的还是我错过了什么?
如果有可能请告诉我如何。如果不可能,我会很感激为什么不解释。
提前致谢。
答案 0 :(得分:1)
试试这个:
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();
答案 1 :(得分:0)
我认为您需要一对子查询而不是限制,但您必须在Child1
和Child2
中映射ParentID值。
每个SubQuery都应该返回childID,其中childID是你的搜索值,然后你可以使用一个连词来返回两个子节点的Parent,如果没有,则返回null,我想。