Używam NHibernate 3.3.1 z FluentNhibernate 1.3 dla warstwy danych.NHibernate: Jak chętniej pobierać elementy podrzędne z filtrem nad podległym obiektem za pomocą jednego zapytania sql bez lazyload?
Mam następujące podmioty: Schemat
Baza:
muszę metodę, która pobiera produktów ubocznych MediaCategory z Medias Produktów. Chcę NHibernate wysłać tylko jedno zapytanie do db i pobrać wszystkie podrzędne właściwości produktów.
Chcę NHibernate wysłać zapytanie tak:
declare @mediaCategoryId int = 13
select *
from Product p
inner join Media m on m.ProductId=p.Id
inner join MediaCategoryMedia mcm on mcm.MediaId=m.Id
inner join MediaCategory mc on mc.Id=mcm.MediaCategoryId
left join ProductSeller ps on ps.ProductId=p.Id
left join Seller s on ps.SellerId=s.Id
where [email protected]
Próbowałem następujących opcji, aby rozwiązać ten problem;
sesja
.QueryOver<ProductEntity>()
...
PróbowałemInner.JoinQueryOver<..>().Fetch.Eager
... ale nie mógł pobrać wszystkie jednostki podrzędne.session.CreateCriteria<ProductEntity>().SetFetchMode("",FetchMode.Eager)
... W tym przypadku działa luźne obciążenie i nie chcę lazyload. Jeśli wyłączyłem lazyload z odwzorowań, NH wysyła wiele zapytań. To, czego chcę, to spore obciążenie jednym zapytaniem, które pobiera wszystkie podsieci.session.Query<ProductEntity>().FetchMany(p=>p.MediaList).ThenFetchMany(m=>m.SellerList)
... Nie można utworzyć aliasu, aby przekazać filtr mediaCategoryId w tym przypadku. Zamiast tego użyłem.Where(x=>x.MediaList.Any(m=>m.CategoryList.Any(...)))
, a wygenerowane zapytanie również nie jest optymalne.(od P w session.Query < ProductEntity>()
z mw p.MediaList
zc w m.MediaCategoryList
gdzie c.Id == 23
wybrać P) .Fetch (x => x.MediaList);to nie działa jak chciałem, zbyt ..
var [email protected]"select p from ProductEntity as p join fetch p.MediaList as m join fetch m.MediaCategoryList as mc left join fetch p.SellerList as s where mc.Id=:catId ";
to działa z "join fetch" w HQL.
Potrzebuję najlepszej praktyki w tej sprawie, jednak Hql jest królem.Czy możemy obsłużyć tę sprawę z
session.Query<>()
lubsession.CreateCriteria,
lubQueryOver
?
Potrzebujesz również "Media.MediaCategoryList", aby powrócić do programu? A może interesuje Cię tylko 'Product.MediaList' i' Product.SellerList'? –