将Nhibernate结果转换为IDictionary <string,int>

时间:2017-04-21 09:46:18

标签: c# .net nhibernate linq-to-nhibernate queryover

我正在尝试将查询结果转换为IDictionary

此处字符串将包含orderId,而int将包含TradedQuantity

下面的查询应该连接三个对象Order,OrderRevision和OrderEvent。   1订单可以有许多订单修订   1 OrderRevision可以有许多orderEvents

查询尝试做的是内连接三个对象并获取订单ID与提供给它的orderid列表匹配的所有订单对象。然后它根据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 个答案:

答案 0 :(得分:1)

您已使用标记了您的问题,因此我认为使用它代替会适合您。使用Linq,使用子查询选择&#34; max&#34;为每个订单订购事件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来回答。