使用父级属性过滤集合

时间:2013-10-02 15:14:22

标签: c# nhibernate nhibernate-mapping

我想使用父类中的属性对集合(SET)应用过滤器 我发现我可以将where子句用于集合 - 它似乎有用 - 但我不确定这是否是最好的选择,或者这个解决方案是否会给我带来痛苦。

enter image description here

这是我的班级Order的映射:

<class name="Order" table="OCSAORH_NHBP" mutable="false" where="OCHAMND = 0">
    <composite-id>
      <key-property name="Number" column="OCHORDN" type="String" length="10"></key-property>
      <key-property name="Ver" column="OCHAMND" type="Int32"></key-property>
      <key-property name="Company" column="OCHCOSC" type="String" length="5"></key-property>
    </composite-id>
    <property name="WareHouseDelivery" column="OCHMAGS" type="String" length="7"></property>

    <set name="OrderLines" access="field.pascalcase-underscore" inverse="true" lazy="true" mutable="false" cascade="none" where="OCLMAGS = this_.OCHMAGS">
      <key>
        <column name="OCLORDN" not-null="true"/>
        <column name="OCLAMND" not-null="true"/> 
        <column name="OCLCOSC" not-null="true"/>
      </key>
      <one-to-many class="OrderLine" not-found ="ignore" />
    </set>
</class>

这是我的班级OrderLine

<class name="OrderLine" table="OCSALIN_NHBP" mutable="false" where="OCLAMND = 0">
    <composite-id>
      <key-property name="Number" column="OCLORDN" type="String" length="10"></key-property>
      <key-property name="Company" column="OCLCOSC" type="String" length="5"></key-property>
      <key-property name="Line" column="OCLLINN" type="Int32"></key-property>
      <key-property name="Seq" column="OCLSSEQ" type="Int32"></key-property>
    </composite-id>
    <property name="Item" column="OCLITMN" type="String" length="19"></property>
    <property name="WareHouseDelivery" column="OCLMAGS" type="String" length="7"></property>

    <many-to-one name="Order" class="Order">
      <column name="OCLORDN" not-null="true"/>
      <column name="OCLAMND" not-null="true"/>
      <column name="OCLCOSC" not-null="true"/>
    </many-to-one>
</class>

这是一个Oracle遗留数据库,我无法更改它的架构。主键都是复合的。

现在,我想使用某些条件获取订单,并使用字段 OCHMAGS (属性WareHouseDelivery)作为过滤器来延迟加载订单行。
正如您所看到的,我使用父表的别名在集合中定义了where子句:

<set name="OrderLines" ... where="OCLMAGS = this_.OCHMAGS">

PS:我急于加载我的订单系列:

var qry = .QueryOver<Domain.Order>()
    .Fetch(t => t.OrderLines).Eager
    .JoinAlias(t => t.OrderLines, () => orderLine, JoinType.LeftOuterJoin);

这是一个可行的解决方案吗?还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

我不确定你的评论: ......它似乎有用......
因为它不能工作。表示this的{​​{1}}在集合映射的WHERE子句中不可用。它是集合表的别名。

该集合与所有者分开加载。 NHibernate将执行Parent SELECT...FROM表:“OCSALIN_NHBP”。没有任何JOIN到父母。作为WHERE子句中的参数注入OrderLine(在您的情况下,键由更多列组成)。就是这样。

如何做到这一点的一种方法是使用ParentId表作为子选择创建更复杂的WHERE子句。 (这当然不适用于大型桌子)

Parent

也许还有其他方法,但 <set ... where="OCLMAGS IN (SELECT p.OCLMAGS FROM OCSAORH_NHBP p WHERE p.OCLORDN = OCLORDN...)" > 不是它似乎是