NHibernate QueryOver在很多表上

时间:2011-12-28 10:33:54

标签: nhibernate queryover

有一个实体努力,其属性为列表,属性为 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进行此类查询?

1 个答案:

答案 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>();