2011-06-23 58 views
5

我想要做的是顯示一個簡單的數據網格,其中包含實體數據及其子集合的數據。例如,讓我們使用訂單和訂單項。我想要顯示訂單信息和訂單項的數量。NHibernate QueryOver選擇實體和聚合

訂單ID,訂購日期,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

考慮:

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

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的投影那是令人沮喪的。不得不指定每一列將是一場噩夢=) – BradLaney

+0

@ user745537是的我可以相信這將是一個痛苦。我會看看我是否可以找出其他解決方案。 –

+0

@ user745537有一段時間來思考它,我不知道你想做什麼的方式。另一個可能的解決方案是使用兩個查詢(一個用於實體,一個用於聚合計數),並使用LINQ將它們連接在內存中。 –

相關問題