使用nhibernate(和queryover)急切地获取多个嵌套关联

使用nhibernate(和queryover)急切地获取多个嵌套关联,nhibernate,collections,associations,fetch,queryover,Nhibernate,Collections,Associations,Fetch,Queryover,我有一个数据库,它有多个嵌套的关联。基本上,结构如下: Order -> OrderItem -> OrderItemPlaylist -> OrderPlaylistItem -> Track -> Artist 我需要根据某个日期内售出的所有订单生成一份报告,该报告需要遍历所有提到的关联,以便生成所需的信息 尝试将所有表连接在一起是一种过分的做法,因为考虑到将6个表连接在一起,这将导致一个包含许多冗余数据的非常大的笛卡尔连接。代码如下: q.Left.Join

我有一个数据库,它有多个嵌套的关联。基本上,结构如下:

Order -> OrderItem -> OrderItemPlaylist -> OrderPlaylistItem -> Track -> Artist
我需要根据某个日期内售出的所有订单生成一份报告,该报告需要遍历所有提到的关联,以便生成所需的信息

尝试将所有表连接在一起是一种过分的做法,因为考虑到将6个表连接在一起,这将导致一个包含许多冗余数据的非常大的笛卡尔连接。代码如下:

q.Left.JoinQueryOver<OrderItem>(order => order.OrderItems)
     .Left.JoinQueryOver<OrderItemPlaylist>(orderItem => orderItem.Playlist)
     .Left.JoinQueryOver<OrderItemPlaylistItem>(orderItemPlaylist => orderItemPlaylist.PlaylistItems)
     .Left.JoinQueryOver<Track>(orderItemPlaylistItem => orderItemPlaylistItem.Track)
     .Left.JoinQueryOver<Artist>(track => track.Artist)
q.Left.JoinQueryOver(order=>order.OrderItems)
.Left.JoinQueryOver(orderItem=>orderItem.Playlist)
.Left.JoinQueryOver(orderItemPlaylist=>orderItemPlaylist.PlaylItems)
.Left.JoinQueryOver(OrderItemPlayItem=>OrderItemPlayItem.Track)
.Left.JoinQueryOver(track=>track.Artist)
上面的方法是可行的,但即使只有几个订单,每个订单都有几个订单项,而且每个播放列表都包含多个曲目,结果也会激增到数千条记录,每增加一个订单,结果就会呈指数级增长

你知道什么是最好、最有效的方法吗?我目前已经尝试启用批处理加载,这大大减少了数据库查询的数量,但在我看来,这仍然不是一种好方法,更像是一种“简单的解决方法”

鉴于数据量巨大,不需要在一个SQL查询中加载所有数据。我想,为每个关联提供一个SQL查询是完美的。理想的情况是,首先获取所有订单,然后获取订单的所有订单项并将其加载到相关集合中,然后是每个订单项的播放列表,依此类推

此外,这不必在QueryOver中特别说明,因为我可以访问
.RootCriteria
并使用Criteria API


任何帮助都将不胜感激

如果您喜欢一个SQL查询,您希望它生成什么样的SQL语法?我想,如果只进行一个SQL查询,就无法避免一长串的
JOIN
s


我想我要做的是使用多个查询逐级获取实体。

您可能应该从在SQL中尽可能最好地定义查询开始,并查看执行计划以找到最好的方法(以及索引是否足够)

在这一点上,您知道自己的目标是什么,然后很容易尝试在HQL或QueryOver甚至LINQ中编写查询代码,并使用NHibernate中的SQL编写器或优秀的NHProfiler检查结果


您可能是对的,最终会有几个查询。通过使用Criteria或QueryOver中的“Future”命令,将尽可能多的(彼此不依赖的)批处理成单个行程,从而加快速度。你可以在这里了解更多信息:

我相信这就是你想要的


我认为,如果不使用6个连接,就无法在一个查询中获得所有连接,这将是一种过分的做法。我更想问的是,考虑到我对NH有点陌生,什么是最有效的方法。虽然它是相关的,但我确实试图避免使用HQL,因为我认为它对于可维护性来说很糟糕