2010-07-15 4 views
0

합성 키로 매핑 된 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를 키 클래스에 올바르게 구현 했으므로 문제가되지 않습니다.

답변

1

예 잘못된 결과를 반환합니다. 전달 된 composite-id 값으로 정의 된 쌍 중 하나라도 true로 평가 될 수 있으므로 [[1,1], [2,2], [3,3 ]]이 쿼리는 [[1,2], [1,3], [2,1] [2,3], [3,1], [3,2] 등]을 가져옵니다.

지금 생각할 수있는 유일한 솔루션 예 ...

(this_.QualificationAreaId = 1 AND this_.QualificationLevelId = 1) OR

(this_.QualificationAreaId = 2 AND this_.QualificationLevelId = 쌍의 분리이고 2) 또는

(this_.QualificationAreaId = 3 AND this_.QualificationLevelId = 3)

등등 .... 이것을 확인하기위한

+0

감사; 나는 분리 루트를 갈 수 있다고 생각하지만, 약간의 고통이 있습니다 - 입력에 감사드립니다. – DanP

관련 문제