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

标签 c# .net nhibernate linq-to-nhibernate 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,使用子查询为每个订单选择“最大”订单事件 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/

相关文章:

时间:2019-03-17 标签:c#EntityFrameworkGroupBywithjoin

c# - 找不到实体类型。确保实体类型已添加到模型中

c# - 将日期从 visual basic 转换为 c-sharp

sql-server - 如何使用 NHibernate ByCode 映射映射 SQL Server `varbinary(max)` 字段?

c# - Serilog WriteTo.File() 在控制台应用程序中有效,但在 .net Core 3 Worker Service 中无效

c# - 变量更改时通过调试进行错误跟踪

c# - 使用 Visual Studio 2015 Intellitest 进行参数化单元测试

c# - 如何从文件夹中获取C#中的文件位置

c# - 如何限制 NHibernate 的 GetByCriteria 拉回的结果集?

c# - 如何使用 asp.net mvc3 和 nhibernate 提高 Web 应用程序性能