2010-07-15 3 views
0

Я пытаюсь выполнить «в» запросе на коллекции объектов Ид (реализовано в виде простого класса с двумя членами целочисленного идентификатора), которые отображаются в виде составных клавиш и I «м видя некоторые странные результаты, когда я запрос с использованием критериев API, используя Restrictions.In и используя NHibernate.Linq с помощью idList.ContainsNHibernate - «В» запросе с композитным идентификатором

Вот пример использования:

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> 

Вот результирующий SQL, который генерируется:

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 */) 

Для меня эта логика кажется ущербной, она выполняет индивидуальный «В» запросов для каждого из композитных ключевых идентификаторов; не приведет ли это к неправильным результатам?

Для справки, у меня есть .equals и .GetHashCode должным образом реализованы на моем ключевом классе, так что я уверен, что это не проблема.

ответ

1

да будет возвращать неверный результат, любой из пар определены значения композиционно-идентификаторов, передаваемых может оценить истинно, так что пока вы запрашиваете, например, [[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) ИЛИ

(this_.QualificationAreaId = 2 И this_.QualificationLevelId = 2) ИЛИ

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

т.д ....

+0

спасибо за подтверждение этого; Полагаю, я могу пойти на путь дизъюнкции, но это немного боль - спасибо за вход. – DanP

Смежные вопросы