3

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

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)

上述方法有效,但即使是几个订单,每个订单都有几个订单项目,以及每个包含多个曲目的播放列表,结果将爆炸到数千条记录,随着每个额外的订单呈指数增长。

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

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

此外,这不必专门在 QueryOver 中,因为我可以访问.RootCriteria和使用 Criteria API。

任何帮助将不胜感激 !

4

3 回答 3

0

如果您更喜欢一个 SQL 查询,您希望它产生什么 SQL 语法?JOIN如果您要进行一个 SQL 查询,我想您无法避免一长串s 。

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

于 2011-05-26T13:19:23.280 回答
0

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

到那时,您就知道自己的目标是什么,然后尝试在 HQL 或 QueryOver 甚至 LINQ 中编写查询代码并使用 NHibernate 中的 SQL 编写器或出色的 NHProfiler http://www来检查结果是相当容易的.nhprof.com

你可能是正确的结束了几个查询。通过使用 Criteria 或 QueryOver 中的“Future”命令将尽可能多的(不相互依赖的)批处理成单次行程来加速它们。您可以在此处阅读更多相关信息:http: //ayende.com/blog/3979/nhibernate-futures

于 2011-06-27T17:13:11.647 回答
0

我相信这就是您正在寻找的

http://ayende.com/blog/4367/eagerly-loading-entity-associations-efficiently-with-nhibernate

于 2011-08-19T20:29:05.567 回答