Nhibernate一对多与标准

时间:2012-12-11 11:01:17

标签: c# .net sql nhibernate

我有一个包含相关对象列表的类。

我将其映射如下:

<class name="MyDto" table="`MyView`" mutable="false"  lazy="false">
    <id name="Id" column="ID" type="int">
        <generator class="assigned" />
    </id>

    <set name="Days" cascade="all-delete-orphan" lazy="false" >
          <key column="Id" />
          <one-to-many class="MyAssociatedObj"/>
    </set>
</class>

<class name="MyAssociatedObj" table="V_SC_NEED" mutable="false" lazy="false" >
    <id name="Id"  column="`ID2`" type="int">
        <generator class="assigned" />
    </id>

    <property type="DateTime" not-null="true" name="DayDate"  column="`Date`" />

    <component name="Audit">
        <property type="string" not-null="true" length="255" name="Username" column="`USERNAME`" />
        <property type="decimal" not-null="true" name="PreviousValue" column="`PrevVal`" />
    </component>
</class>

我想要做的是获取一个MyDto对象列表,按我的关联对象MyAssociatedObject进行过滤。

这意味着,例如,如果我这样做:

UnitOfWork.Session.CreateCriteria<MyDto>().List<MyDto>()

我得到了42行的清单。 现在,我想通过我的相关对象,通过两者之间的限制来过滤它们。 问题是当我这样做时:

UnitOfWork.Session.CreateCriteria<MyDto>().CreateAlias("Days", "days").Add(Restrictions.Between("days.DayDate", query.FromDate, query.ToDate));

我正在以某种方式获得684行! (某些卡通产品或其他东西)。

有什么建议吗? 非常感谢!

1 个答案:

答案 0 :(得分:2)

您在第二个查询中获得了更多行,因为您<{>>加入与MyAssociatedObj,这似乎与多对一关系你的MyDTO课程 如果要过滤掉MyDTO的重复项,可以使用DistinctRootResultTransformer:

UnitOfWork.Session.CreateCriteria<MyDto>().CreateAlias("Days", "days")  
   .Add(Restrictions.Between("days.DayDate", query.FromDate, query.ToDate))  
   .SetResultTransformer(  
          new NHibernate.Transform.DistinctRootEntityResultTransformer());  

希望它有所帮助。