NHibernate在许多表格上查询
有一个实体努力具有属性列表和属性AdType 我们有几个adTypesenum对象和specialListsenum对象可供选择NHibernate在许多表格上查询,nhibernate,queryover,Nhibernate,Queryover,有一个实体努力具有属性列表和属性AdType 我们有几个adTypesenum对象和specialListsenum对象可供选择IList 我是这样做的: return NHibernateSession.QueryOver<Effort>() .JoinQueryOver(effort => effort.AdType) .WhereRestrictionOn(adType => adType.Id)
IList
我是这样做的:
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>();
返回NHibernateSession.QueryOver()
.JoinQueryOver(effort=>effort.AdType)
.WhereRestrictionOn(adType=>adType.Id)
.IsIn(adTypes.Select(adt=>(long)adt.ToList())
.Clone()
.JoinQueryOver(efforce=>efforce.List)
.WhereRestrictionOn(list=>list.Id)
.IsIn(specialLists.Select(sl=>(long)sl.ToList())
.List();
正如你所看到的,我使用了一个奇怪的Clone()方法,它没有任何描述。它工作得很好
您以何种方式使用QueryOver进行此类查询?.JoinQueryOver(effort=>effort.AdType)
将返回带有子类型的QueryOver,此处AdType
IQueryOver
而不是原始的IQueryOver
。第一个泛型参数是queryType,第二个泛型参数是在其上操作方法的类型。如果在两者之间进行克隆,则整个查询将被复制并作为basequeryIQueryOver
返回
为了防止查询切换到子类型,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 adAlias=null;
ListType listAlias=null;
返回NHibernateSession.QueryOver()
.JoinAlias(effort=>effort.AdType,()=>adAlias)
.JoinAlias(efforce=>efforce.List,()=>listAlias)
.WhereRestrictionOn(()=>adAlias.Id).IsIn(adTypes.Cast().ToList())
.WhereRestrictionOn(()=>listalis.Id).IsIn(specialists.Cast().ToList())
.List();
如果只限制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>();
返回NHibernateSession.QueryOver()
.WhereRestrictionOn(effort=>effort.Adtype.Id).IsIn(adTypes.Cast().ToList())
.WhereRestrictionOn(efforce=>efforce.List.Id).IsIn(specialists.Cast().ToList())
.List();
我很好奇,如果省略克隆,会发生什么情况,也会向数据库触发什么SQL?如果没有克隆(),它将不会尝试执行以下工作。它将尝试对AdType执行此操作。因此将不会有.JoinQueryOver(efforce=>efforce.List),而是.JoinQueryOver(adType=>adType…)