HQL與

2012-10-30 68 views
0

內的最大值實體的選擇ID我有這樣的小實體HQL與

class Order 
{ 
    public long Id; 
    public DateTime Date; 
    public long ProductId; 
} 

我要選擇具有由ProductId分組的訂單中MAX(Date)實體Id。 對(MAX(Date)ProductId)不是唯一的所以這個查詢是錯誤的:

select o.Id 
from Order o 
where o.Date = 
    (select max(o2.Date) 
    from Order o2 
    where o2.ProductId = o.ProductId); 

你有什麼想法?

基本上我想要的是從集團獲得最近的訂單,所以如果我認爲更大的Id ==新Order這樣的:

select o 
from Order o 
where o.Id in 
    (select max(o2.Id) 
    from Order o2 
    group by o2.ProductId); 

會爲我工作。有沒有更好的解決方案?

+0

它並非總是如此,如果某人更改/更新訂單日期,那麼您的查詢將不會返回正確的結果。 –

+0

100%正確;-)因此,我要求更好的解決方案 – Mixer

回答

0

嘗試自我加入而不是查詢更好的性能。

0

需要在查詢中進行優化,但它適用於您。

List<Order> orders = GetOrders(); 

     var result = from o in orders 
         group o by new { o.ProductId } into ordGrouping 
         let MaxOrderDate = ordGrouping.Max(od=>od.Date) 
         let OrderID = ordGrouping.First(od=>od.Date.Equals(MaxOrderDate)).Id 
         select new 
         { 
          ProductId = ordGrouping.Key.ProductId, 
          OrderId = OrderID, 
          OrderDate = MaxOrderDate 
         }; 

     foreach (var item in result) 
     { 
      Console.WriteLine(string.Format("Product ID:{0}, OrderId: {1} Date: {2}", item.ProductId, item.OrderId, item.OrderDate.ToLongDateString() + item.OrderDate.ToLongTimeString())); 
     }