2017-04-21 79 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