0

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

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 的双链接。

4

3 回答 3

1

谢谢,连接并不像示例那么简单,并且使用了很多表 - 如果在基于 SQL 集的设置中完成,那很好,但是会返回大量可笑的数据以在 linq 中对其进行过滤。

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

干杯

斯图

于 2010-02-14T11:14:32.957 回答
0

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

如果您要求它直接在父对象上可用,我建议在父对象上创建另一个变量,该变量通过 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 查询匹配的子对象。

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

祝你好运!

于 2009-12-17T01:53:01.350 回答
0

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

于 2009-12-22T21:44:11.300 回答