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

Casting Nhibernate result into IDictionary<string,int>

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

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

下面的查询应该连接三个对象 Order、OrderRevision 和 OrderEvent。 1 个订单可以有多个 orderRevisions 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 吗?

您已将您的问题标记为 , so I guess using it instead of 适合您。使用 Linq,使用子查询为每个订单选择 "max" 订单事件 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 给出答案。