NHibernate-”一词;在;具有复合id的查询
我试图对映射为复合键的id对象集合(实现为一个简单类,包含两个整数id成员)执行“in”查询,当我使用criteria api使用Restrictions.in和使用NHibernate.Linq使用idList.Contains进行查询时,我看到了一些奇怪的结果 下面是一个示例用法:NHibernate-”一词;在;具有复合id的查询,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我试图对映射为复合键的id对象集合(实现为一个简单类,包含两个整数id成员)执行“in”查询,当我使用criteria api使用Restrictions.in和使用NHibernate.Linq使用idList.Contains进行查询时,我看到了一些奇怪的结果 下面是一个示例用法: Public Function GetByMultipleIds(ByVal ids As ICollection(Of QualificationKey)) As IList(Of Qualificat
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>
对我来说,这种逻辑似乎有缺陷,它对每个复合密钥ID执行单独的“In”查询;这不会返回错误的结果吗
作为参考,我已经在我的key类上正确实现了.Equals和.GetHashCode,所以我确信这不是问题所在。是的,它将返回错误的结果,任何定义的组合id值都可以计算为true,因此,当您请求例如[[1,1]、[2,2]、[3,3]]时,此查询还将获取[[1,2]、[1,3]、[2,1][2,3]、[3,1]、[3,2]等 我现在能想到的唯一解决办法是成对的析取 (此u.QualificationEAID=1且此u.QualificationLevelId=1)或 (此u.QualificationEAID=2,此u.QualificationLevelId=2)或 (此u.QualificationEAID=3,此u.QualificationLevelId=3)
等等……感谢您确认这一点;我想我可以走分离路线,但这有点痛苦-感谢您的输入。
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 */)