有一个实体努力,其属性为列表,属性为 AdType
我们有几个 adTypes 枚举对象和 specialLists 枚举对象,可以选择 IList<Effort>
我是这样做的:
return NHibernateSession.QueryOver<Effort>()
.JoinQueryOver(effort => effort.AdType)
.WhereRestrictionOn(adType => adType.Id)
.IsIn(adTypes.Select(adt => (long)adt).ToList())
.Clone()
.JoinQueryOver(effort => effort.List)
.WhereRestrictionOn(list => list.Id)
.IsIn(specialLists.Select(sl => (long)sl).ToList())
.List<Effort>();
你可以看到我使用了一个没有任何描述的奇怪的Clone()方法。它很棒。
您以何种方式使用QueryOver进行此类查询?
答案 0 :(得分:6)
.JoinQueryOver(effort => effort.AdType)
将返回一个带有子类型的QueryOver,此处为AdType
IQueryOver<Effort, Adtype>
,而不是原始IQueryOver<Effort, Effort>
。第一个通用参数是 queryType ,第二个参数是操作方法的类型。如果您在克隆之间复制整个查询并将其作为基本查询IQueryOver<Effort, Effort>
返回。
为了防止QueryOver切换到子类型,有JoinAlias创建别名而不是降序。
AdType adAlias = null;
ListType listAlias = null;
return NHibernateSession.QueryOver<Effort>()
.JoinAlias(effort => effort.AdType, () => adAlias)
.JoinAlias(effort => effort.List, () => listAlias)
.WhereRestrictionOn(() => adAlias.Id).IsIn(adTypes.Cast<long>().ToList())
.WhereRestrictionOn(() => listAlias.Id).IsIn(specialLists.Cast<long>().ToList())
.List<Effort>();
如果您只限制adtype和listtype的ID,那么
return NHibernateSession.QueryOver<Effort>()
.WhereRestrictionOn(effort => effort.Adtype.Id).IsIn(adTypes.Cast<long>().ToList())
.WhereRestrictionOn(effort => effort.List.Id).IsIn(specialLists.Cast<long>().ToList())
.List<Effort>();