【问题标题】:NHibernate QueryOver with JoinQueryOver select all columnsNHibernate QueryOver 与 JoinQueryOver 选择所有列
【发布时间】:2013-02-01 14:08:51
【问题描述】:

我有一些带有多个连接的 QueryOver,就返回的对象而言,我得到的结果是可以的。这是代码>

   var l = session.QueryOver<Discount>(() => discount)
                .JoinQueryOver<ConPrdGrp>(r => r.ConPrdGrps)
                .JoinQueryOver<PrdGroupTree>(k => k.PrdGroupTree)
                .JoinQueryOver<Product>(g => g.Products)
                .Where(p => p.ProductID == Product.ProductID)
                .And(() => discount.FomDato <= DateTime.Now && discount.TomDato >= DateTime.Now).List();

但是,如果我查看 SQL 语句,我可以看到生成的查询从所有连接的表中选择了所有列,尽管结果只返回了 Discount 对象的列表。我可以使用投影获得折扣的一些属性,并且查询会小得多。但是我如何指示 NHibernate 从 Discount 表中获取列,而不是从所有连接表中获取?

【问题讨论】:

    标签: nhibernate queryover


    【解决方案1】:

    据我所知,没有像.Select(Projections.Properties&lt;Discount&gt;()) 这样的简单方法。检查这个有点过时的问题(NHIbernate: Shortcut for projecting all properties?

    您可以做的是明确命名您想要查看的列:

      ... // the QueryOver you have
      .SelectList (l => l
        .Select(() => discount.ID).WithAlias(() => discount.ID)
        .Select(() => discount.Code).WithAlias(() => discount.Code)
        ...
      )
      .TransformUsing(Transformers.AliasToBean<Discount>())
      ...
    

    第二种方法可能是创建子查询,然后只创建QueryOver&lt;Discount&gt;() 16.8. Subqueries

    QueryOver<Discount> subQuery =
        QueryOver.Of<Discount>(() => innerDiscount)
          .JoinQueryOver<ConPrdGrp>(r => r.ConPrdGrps)
          .JoinQueryOver<PrdGroupTree>(k => k.PrdGroupTree)
          .JoinQueryOver<Product>(g => g.Products)
          .Where(p => p.ProductID == Product.ProductID)
          .And(() => innerDiscount.FomDato <= DateTime.Now 
                  && innerDiscount.TomDato >= DateTime.Now).List()
          .Select( Projections.Property(() => innerDiscount.ID))
     ;
    
    var query = session.QueryOver<Discount>(() => discount)
      .Where(Subqueries.PropertyIn("ID", subQuery.DetachedCriteria))
      ;
    

    【讨论】:

    • 我考虑了这两种方法,第一种似乎是最正确的,但不适用于具有许多属性的实体。
    • 我同意。子查询稍微复杂一点,但更合理
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多