我有一个包含相关对象列表的类。
我将其映射如下:
<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行! (某些卡通产品或其他东西)。
有什么建议吗? 非常感谢!
答案 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());
希望它有所帮助。