Anu*_*bis 2 nhibernate queryover
有一个实体Effort有一个属性List和一个属性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,第二个参数是操作方法的类型.如果您在克隆之间整个查询被复制并作为基本查询返回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>();
| 归档时间: | 
 | 
| 查看次数: | 3721 次 | 
| 最近记录: |