有一个实体努力,其属性列表和属性 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用于此类查询?
最佳答案
.JoinQueryOver(effort => effort.AdType)
将返回带有子类型的QueryOver,此处为AdType
IQueryOver<Effort, Adtype>
而不是原始IQueryOver<Effort, Effort>
。第一个通用参数是queryType,第二个是方法所基于的类型。如果您在两者之间进行克隆,则会复制整个查询,并将其作为basequery 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>();
不是,如果您仅限制广告类型和列表类型的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>();
关于nhibernate - NHibernate QueryOver在许多表上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8654733/