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

这里的字符串将包含orderId,而int将包含TradedQuantity

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

查询要执行的操作是内部联接三个对象,并获取其订单ID与为其提供的订单ID列表匹配的所有订单对象。然后,它基于orderId进行分组,并从orderEvents对象获取最新的TradedQuantity。 LatestTradedQuantity将是来自最新OrderEvent的TradedQuantity。目前,可以将最新的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?

最佳答案

您已经用linq-to-nhibernate标记了您的问题,所以我想用它代替queryover会很适合您。使用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给出答案。

关于c# - 将Nhibernate结果转换为IDictionary <string,int>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43539393/

10-16 11:04