2017-04-21 120 views
2

我想转换结果的查询到IDictionary的铸造NHibernate的结果转换成IDictionary的<string,int>

这里字符串将包含订单ID和INT将包含TradedQuantity

下面的查询应加入三个对象秩序, OrderRevision和OrderEvent。 1订单可以有很多orderRevisions 1 OrderRevision可以有很多orderEvents

什么查询试图做的是内部连接三个对象,并得到所有的订单对象,它们的订单ID提供给它orderids的列表匹配。然后它根据orderId完成一个组,并从orderEvents对象获取最新的TradedQuantity。 LatestTradedQuantity将是TradedQuantityFrom最新的OrderEvent。现在可以将最新的orderevent视为OrderEventId值最高的那个。

OrderRevision revisionAlias = null; 
Order orderAlias = null; 

var query = 
      Session.QueryOver<OrderEvent>() 
       .JoinAlias(oe => oe.OrderRevision,() => revisionAlias) 
       .JoinAlias(oe => oe.OrderRevision.Order,() => orderAlias) 
       .Where(x => x.OrderRevision.Order.SourceSystem.Name.ToLower() == sourceSystem.ToLower()) 
       .WhereRestrictionOn(x => x.OrderRevision.Order.Id).IsIn(orderIds.ToList()) 
       .SelectList(list => list.SelectGroup(x => x.OrderRevision.Order.SourceOrderIdentifier) 
        .SelectMax(x => x.Id).Select(x => x.TradedQuantity)) 
       .Select(x => new KeyValuePair<string, int?>(x.OrderRevision.Order.SourceOrderIdentifier, x.TradedQuantity) 
       ); 

由于此查询不做什么应该。你能帮忙,让我知道如何将结果投入到IDictionary中吗?

回答

1

你已经用标记了你的问题,所以我想用它代替会适合你。使用Linq,使用子查询为每个订单选择“最大”订单事件ID,然后查询它们并将它们投影到字典中。

using System.Linq; 
using NHibernate.Linq; 

... 

var orderEventsIdsQuery = Session.Query<OrderEvent>() 
    .Where(oe => orderIds.Contains(oe.OrderRevision.Order.Id)) 
    .GroupBy(oe => oe.OrderRevision.Order.SourceOrderIdentifier, 
     (soi, oes) => oes.Max(oe => oe.Id)); 

var result = Session.Query<OrderEvent>() 
    .Where(oe => orderEventsIdsQuery.Contains(oe.Id)) 
    .ToDictionary(oe => oe.OrderRevision.Order.SourceOrderIdentifier, 
     oe => oe.TradedQuantity); 

这应该做的工作。我不使用QueryOver,我也不会试图用QueryOver做出答案。

+0

谢谢你的回答。一旦我尝试并测试它,我会回到你身边。 – Sike12

+0

谢谢你弗雷德里克 – Sike12