在多个子实体上限制流畅的nhibernate查询,将属性与单个值进行比较

时间:2014-03-13 14:56:43

标签: nhibernate fluent-nhibernate queryover

我想使用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();

所以基本上我的问题是我无法与一个值进行比较,但总是必须人为地创建一个数组。这是不可能的还是我错过了什么?

如果有可能请告诉我如何。如果不可能,我会很感激为什么不解释。

提前致谢。

2 个答案:

答案 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)

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

每个SubQuery都应该返回childID,其中childID是你的搜索值,然后你可以使用一个连词来返回两个子节点的Parent,如果没有,则返回null,我想。