我有一个具有多个嵌套关联的数据库。基本上,结构如下:
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。
任何帮助将不胜感激 !