HQL选择组内最大值的实体ID

时间:2012-10-30 17:01:17

标签: c# sql hibernate hql

我有这个小实体

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

我想在Id分组的订单中选择MAX(Date)个实体ProductId。 配对(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);

对我有用。有没有更好的解决方案?

2 个答案:

答案 0 :(得分:0)

在查询中尝试自联接而不是,以获得更好的效果。

答案 1 :(得分: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()));
        }