将 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 吗?
您已将您的问题标记为 linq-to-nhibernate, so I guess using it instead of queryover 适合您。使用 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 给出答案。
我正在尝试将查询结果转换成 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 吗?
您已将您的问题标记为 linq-to-nhibernate, so I guess using it instead of queryover 适合您。使用 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 给出答案。