有一个实体努力,其属性列表和属性 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/

10-11 02:00