NHibernate - запрос "In" с составным идентификатором - PullRequest
0 голосов
/ 15 июля 2010

Я пытаюсь выполнить запрос "in" для коллекции объектов id (реализованных в виде простого класса с двумя целочисленными членами id), которые отображаются как составные ключи, и я вижу некоторые странные результаты, когда я запрашиваюиспользуя критерии api с помощью Restrictions.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>

Вот результирующий сгенерированный 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 */)

Мне кажется, что эта логика ошибочна, она выполняет отдельные запросы In для каждого из составных идентификаторов ключей;не приведет ли это к неверным результатам?

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

1 Ответ

1 голос
/ 16 июля 2010

да, он будет возвращать неправильные результаты, любая из пар, определенных переданными значениями составного идентификатора, может быть оценена как истина, поэтому при запросе, например, [[1,1], [2,2], [3,3] ] этот запрос также будет извлекать [[1,2], [1,3], [2,1] [2,3], [3,1], [3,2] и т. д.] ..

единственное решение, которое я могу думать сейчас, это дизъюнкция пар ... например

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

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

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

и т.д ....

...