代码之家  ›  专栏  ›  技术社区  ›  Stu

在使用nhibernate的联接中使用嵌套select

  •  0
  • Stu  · 技术社区  · 15 年前

    如果可能的话,我想用NHibernate独立标准编写以下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的双重链接。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Stu    15 年前

    谢谢,这个连接并不像例子那么简单,而且有很多表正在使用中——如果在基于SQL集的设置中进行,那就很好了,但是会有大量的数据返回到LINQ中对其进行过滤。

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

    干杯

    斯图

        2
  •  0
  •   Serkan    15 年前

    我将在父级(按childdate排序)上创建一个排序列表属性,因此当您最后一个(可能有LINQ扩展)时,您将得到所需的属性。不需要创建复杂的联接。

        3
  •  0
  •   Jay Tauqeer Ahmad    15 年前

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

    如果您需要在父对象上直接使用此变量,我建议在父对象上创建另一个变量,该变量通过parent.hbm.xml文件中的“where”属性预先筛选了这些详细信息。如果您不想这样做,我建议您使用Linq或类似的方法为集合中的每个父对象提取最新的子对象。

    在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 . 虽然这是冬眠参考,而不是NHibernate,但在大多数地区几乎是相同的。

    祝你好运!

    推荐文章