2

いくつかの結合を持ついくつかのQueryOverがあり、返されたオブジェクトに関しては、得られる結果はOKです。これはコードです>

   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のいくつかのプロパティを取得でき、クエリははるかに小さくなります。しかし、結合されたすべてのテーブルからではなく、Discountテーブルから列だけを取得するようにNHibernateに指示するにはどうすればよいですか?

4

1 に答える 1

3

私の知る限り、次のような単純な方法はありません.Select(Projections.Properties<Discount>())。この少し時代遅れの質問を確認してください ( 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>())
  ...

2 番目のアプローチは、サブクエリを作成してから 16.8.1 にすることQueryOver<Discount>() です。サブクエリ

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))
  ;
于 2013-02-01T15:15:24.820 に答える