합성 키로 매핑 된 id 객체 컬렉션 (두 개의 정수 id 멤버를 가진 간단한 클래스로 구현 됨)에서 "in"쿼리를 수행하려고합니다. '내가 Restrictions.In를 사용하여 기준 API를 사용하여 쿼리 할 때 이상한 결과를보고하고 여기에 NHibernate - 복합 ID를 가진 "In"쿼리
은 샘플 사용입니다 NHibernate.Linq 사용 idList.Contains을 사용하고 있습니다 : 여기Public Function GetByMultipleIds(ByVal ids As ICollection(Of QualificationKey)) As IList(Of Qualification) Implements IQualificationRepository.GetByMultipleIds
Dim query = Session.CreateCriteria(Of Qualification)()
query.Add(Restrictions.In("Id", ids.ToArray()))
Return query.List(Of Qualification)()
End Function
나의 키에 대한 매핑 :
<composite-id name="Id" class="QualificationKey">
<key-property name="QualificationAreaId" column="QualificationAreaId"/>
<key-property name="QualificationLevelId" column="QualificationLevelId"/>
</composite-id>
는 복합 키 식별자의 각각에 대한 쿼리 "에서"별도의 공연을하고 있어요, 나에게
SELECT this_.QualificationAreaId as Qualific1_6_2_,
this_.QualificationLevelId as Qualific2_6_2_,
this_.Version as Version6_2_,
this_.Rank as Rank6_2_,
(SELECT QualificationArea.QualificationAreaTypeId
FROM QualificationArea
WHERE QualificationArea.QualificationAreaId = this_.QualificationAreaId) as clazz_2_,
qualificat2_.QualificationAreaId as Qualific1_7_0_,
qualificat2_.Name as Name7_0_,
qualificat2_.QualificationAreaTypeId as Qualific2_7_0_,
qualificat2_.QualificationAreaPermissionId as Qualific4_7_0_,
qualificat2_.Description as Descript5_7_0_,
qualificat2_.QualificationAreaExpirySettingId as Qualific6_7_0_,
qualificat2_.DisplayOrder as DisplayO7_7_0_,
qualificat2_.DateCreated as DateCrea8_7_0_,
qualificat2_.DateUpdated as DateUpda9_7_0_,
qualificat2_.ShowOnSignupForm1 as ShowOnS10_7_0_,
qualificat2_.ShowOnSignupForm2 as ShowOnS11_7_0_,
qualificat2_.ShowOnSignupForm3 as ShowOnS12_7_0_,
qualificat2_.AgencyId as AgencyId7_0_,
qualificat3_.QualificationLevelId as Qualific1_47_1_,
qualificat3_.Name as Name47_1_,
qualificat3_.Description as Descript3_47_1_,
qualificat3_.DateCreated as DateCrea4_47_1_,
qualificat3_.DateUpdated as DateUpda5_47_1_,
qualificat3_.AgencyId as AgencyId47_1_,
dbo.IsQualificationLevelAssociatedWithAnyQualifications(qualificat3_.QualificationLevelId) as formula21_1_
FROM Qualification this_
inner join QualificationArea qualificat2_
on this_.QualificationAreaId = qualificat2_.QualificationAreaId
inner join QualificationLevel qualificat3_
on this_.QualificationLevelId = qualificat3_.QualificationLevelId
WHERE this_.QualificationAreaId in (1 /* @p0 */,2 /* @p1 */,3 /* @p2 */)
and this_.QualificationLevelId in (1 /* @p3 */,2 /* @p4 */,3 /* @p5 */)
는,이 논리는 결함이 보인다; 여기 691,363,210
가 발생있어 결과 SQL입니다 이것은 잘못된 결과를 반환하지 않을까요?
참고로 .Equals와 .GetHashCode를 키 클래스에 올바르게 구현 했으므로 문제가되지 않습니다.
감사; 나는 분리 루트를 갈 수 있다고 생각하지만, 약간의 고통이 있습니다 - 입력에 감사드립니다. – DanP