Fetching mai multe colecții imbricate cu nerăbdare în selecte separate folosind NHibernate

Am următoarea structură a bazei de date, pe care trebuie să o traversez în întregime pentru un raport.

Product -> ProductVariation -> ProductMedaItem
Product -> CategoryLinks -> Category

Am o interogare în tabelul Products și vreau să prefethez datele de mai sus, deoarece le voi accesa împreună. Vreau să evit să folosesc JOIN-urile, deoarece combinațiile ar exploda și vor duce la o mulțime de date.

Soluția ideală în ochii mei ar fi următoarea:

  • A query is issued to load all matching products
  • Then, the result set is parsed, and all product variations are loaded together, based on a query similar to 'Select * from ProductVariations where ProductId in ([all_product_id_set]);
  • Again, this result set is parsed and all ProductMediaItem are fetched using a query similar to Select * from ProductMediaItem where ProductVariationId in ([all_product_variation_id_set]);
  • So on and so forth

Aceasta ar duce la un SELECT pentru fiecare asociere diferită. Astfel, pentru a încărca toate variantele de produse, articolele lor media și fiecare legătură de categorii de produse și categoriile lor respective ar rezulta 5 SELECT s.

Am încercat să folosesc criteriile criteria.SetFetchMode ("ProductVariations", FetchMode.Select ") , dar acest lucru nu face nimic. toate datele, care, deși nu prea lent, cred că ar putea fi mult mai rapidă.

Folosesc cea mai recentă versiune NHibernate - 3.3.

Update 1

Aș dori să trec colecția folosind OOP normal, de exemplu:

foreach (var p in Products)
{
    foreach (var variation in p.ProductVariations)
    {
        foreach (var mediaItem in variation.MediaItems)
        {
              ...
        }
    }
}
0

1 răspunsuri

MultiQueries și MultiCriteria vor funcționa sau chiar mai ușor vor fi futures, de exemplu:

var productVariations = session.CreateQuery(
        "Select * from ProductVariations where ProductId in ([all_product_id_set])")
        .Future();

var mediaItems = session.CreateQuery(
        "select pv.MediaItems from ProductVariations pv where pv.ProductId in ([all_product_id_set])")
        .Future();

etc ... Când enumerați pe oricare dintre ele, va executa toate interogările în 1 go, singurul "truc" este de a naviga în jos relația de la produs la diferitele elemente pe care doriți să le selectați

0
adăugat
Asta ar funcționa, dar aș vrea ca NHibernate să prefere automat colecțiile pentru mine, folosind structura normală a codului. Astfel, aș încărca lista de produse și dacă accesez Products [0] .ProductVariations [0] .ProductMediaItems [0] , nu este nevoie să le ducem și să le preluăm, dar sunt deja acolo.
adăugat autor Karl Cassar, sursa