使用NHibernate在连接中使用子选择

时间:2009-12-16 18:49:41

标签: c# nhibernate detachedcriteria

如果可能,我想在NHibernate中编写以下SQl - Detached Criteria。

select * from parent 
INNER JOIN child on parent.id=child.parentid 
INNER JOIN 
  (select ChildID, MAX(ChildDate) MaxChildDate from child group by ChildID) max
ON child.childid, child.ChildDate=max.MaxChildDate

这给了我每个角落里最新的孩子。

我可以在Critera中编写子查询,但不能执行ChildID和MaxDate的双重链接。

3 个答案:

答案 0 :(得分:1)

谢谢,连接并不像示例那么简单,并且使用了很多表 - 如果在基于SQL集的设置中完成,那就很好了,但是会有一些荒谬的数据返回来过滤它在linq。

不幸的是,速度必须赢得设计所以我创建了一个带有复杂连接的视图,并将其用作主域对象上的字典的表。谢谢你的帮助。

干杯

斯图

答案 1 :(得分:0)

我不能说我真的知道你要问的方法,NHibernate返回你正在查询的实际对象,在这种情况下它将返回一个列表/一组Parent对象。然后,此Parent对象将附加一个Child对象的集合。据我所知,连接到这些数据两次并提取不同信息的概念在NHibernate中不起作用。

如果您需要在Parent上直接使用它,我建议在Parent对象上创建另一个变量,该变量通过Parent.hbm.xml文件中的“where”属性预过滤这些详细信息。如果您不希望这样做,我建议使用LINQ或类似的东西为您的集合中的每个Parent提取最新的Child对象。

您在Parent.hbm.xml文件中找到的“where”属性的示例是:

<set name="LatestChild" table="child" generic="true" inverse="true" where="*your sub-query here*">
  <key column="parent_id" />
  <one-to-many class="YourNameSpace.Model.Child,Model"/>
</set>

这将只返回与集合的where查询匹配的Child对象。

您可以找到有关此here的文档。虽然这是Hibernate参考而不是NHibernate,但它在大多数领域几乎完全相同。

祝你好运!

答案 2 :(得分:0)

我会在父级上创建一个排序列表属性(按ChildDate排序),所以当你获得最后一个(可能有linq扩展名)时,你会得到你需要的那个。无需创建复杂的连接。