我正在尝试将查询结果转换为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吗?
答案 0 :(得分:1)
您已使用linq-to-nhibernate标记了您的问题,因此我认为使用它代替queryover会适合您。使用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来回答。