У меня есть база данных, которая имеет несколько вложенных партнеров. В основном, структура выглядит следующим образом:
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.
Любая помощь будет принята с благодарностью!