【问题标题】:Using a subselect in a join using NHibernate在使用 NHibernate 的连接中使用子选择
【发布时间】:2009-12-16 18:49:41
【问题描述】:

如果可能,我想在 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的双重链接。

【问题讨论】:

    标签: c# nhibernate detachedcriteria


    【解决方案1】:

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

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

    干杯

    学习

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我不能说我实际上知道一种方法来做您所要求的事情,NHibernate 返回您正在查询的实际对象,在这种情况下它将返回一个父对象的列表/集合。然后,此 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 查询匹配的子对象。

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

        祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多