【问题标题】:NHibernate QueryOver over many tablesNHibernate QueryOver 在许多表上
【发布时间】:2011-12-28 10:33:53
【问题描述】:

有一个实体 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 进行此类查询?

【问题讨论】:

  • 我很好奇,如果省略克隆会发生什么,以及向数据库触发什么 SQL?
  • 如果没有 Clone(),它将不会尝试执行以下 Join to Effort。它将尝试对 AdType 执行此操作。所以不会有 .JoinQueryOver(effort => effort.List) 它将是 .JoinQueryOver(adType => adType.....)

标签: nhibernate queryover


【解决方案1】:

.JoinQueryOver(effort =&gt; effort.AdType) 将返回一个带有子类型的 QueryOver,这里是 AdType IQueryOver&lt;Effort, Adtype&gt; 而不是原来的 IQueryOver&lt;Effort, Effort&gt;。第一个通用参数是 queryType,第二个是方法操作的类型。如果您在之间进行克隆,整个查询将被复制并作为基本查询 IQueryOver&lt;Effort, Effort&gt; 返回。

为了防止 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>();

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多