2011-06-23 23 views
5

私がしたいのは、エンティティデータとその子の集合データを含む単純なグリッドのデータを表示することです。たとえば、オーダーと広告申込情報を使用できます。注文情報と広告申込情報の数を表示したい。NHibernate QueryOver選択されたエンティティと集合

受注、受注日、NumOfLineItems

は今、通常SQLにあなたは多くの方法、それを行うことができます。しかし、これは私がNHibernateに翻訳するときに動作するかもしれないと考えることができる唯一の方法です。

SELECT o.OrderID, OrderDate, NumOfLineItems 
FROM #Orders o 
INNER JOIN 
(SELECT o2.OrderID, COUNT(*) As NumOfLineItems FROM #LineItems l 
INNER JOIN #Orders o2 ON o2.OrderID = l.OrderID 
WHERE UserID = 1 GROUP BY o2.OrderID) t1 ON o.OrderID = t1.OrderID 
WHERE UserID = 1 

私は他の方法があるけど、私はNHibernateのは私がQueryOver構文を使用して行うことを可能にする方法を考えるしようとしています。私は派生列を使用したくありません。私はSQLを書くのを避けようとしています。

私のエンティティでは、私はOrderエンティティとAggregatedOrderエンティティを持っています。この場合、私のDTOになります。私はトランスフォーマーaliastobeanを使ってデータをコピーします。

私はこれを理解する方法を全く考えていません。

私がこれまで持っているすべて:

考える
 QueryOver<LineItem> x = QueryOver.Of<LineItem>() 
      .SelectList(p => p .SelectCount(l => l.Id).WithAlias(() => itemAlias.NumOfLineItems)) 
      .JoinQueryOver<Order>(l => l.Order) 
      .Where(o => o.UserID == userID) 


     var y = session.QueryOver<Listing>() 
      .JoinQueryOver<Bid>(x); // no idea whats going on here 

答えて

5

public class Order 
{ 
    public virtual int OrderId {get; set;} 
    public virtual DateTime OrderDate {get; set;} 
    public virtual IList<LineItem> LineItems {get; set;} 
} 
public class LineItem 
{ 
    public virtual int Id {get; set;} 
    public virtual string Description {get; set;} 
} 

次の操作を行うことができQueryOverのAPIを使用して注文+集約のLineItemの投影を照会するには:

OrderDto orderDto = null; 
LineItem items = null; 
var results = session.QueryOver<Order>() 
    .JoinAlias(o => o.LineItems,() => items) 
    .Select(Projections.ProjectionList() 
     .Add(Projections.Property<Order>(o=>o.Id).WithAlias(()=>orderDto.OrderId)) 
     .Add(Projections.Property<Order>(o=>o.DateOrdered).WithAlias(()=>orderDto.DateOrdered)) 
     .Add(Projections.Count(()=> items.Id).WithAlias(()=>orderDto.ItemCount)) 
    ) 
    .TransformUsing(Transformers.AliasToBean<OrderDto>()) 
    .List<OrderDto>(); 
+1

まあそれは落胆しています。すべての単一の列を指定することは悪夢になる=) – BradLaney

+0

@ user745537はい私はそれが痛みであると信じることができます。私は他の解決策を見つけられるかどうかを見ていきます。 –

+0

@ user745537それについて考える時間があったし、あなたがしたいことをする方法がわからない。もう1つの可能な解決方法は、2つのクエリ(エンティティに1つ、集計に1つ)を使用し、LINQを使用してそれらをメモリにまとめて結合することです。 –

関連する問題