NHibernate: Comment avides de récupérer des sous entités avec un filtre sous l'entité par l'entremise d'une requête sql sans lazyload?

Je suis à l'aide de NHibernate 3.3.1 avec FluentNhibernate 1.3 pour la Couche de Données.

J'ai les entités suivantes:

NHibernate: Comment avides de récupérer des sous entités avec un filtre sous l'entité par l'entremise d'une requête sql sans lazyload?

Schéma De Base De Données:
NHibernate: Comment avides de récupérer des sous entités avec un filtre sous l'entité par l'entremise d'une requête sql sans lazyload?

J'ai besoin d'une méthode qui obtient les Produits par MediaCategory de Médias de Produits. Je veux NHibernate pour envoyer une seule requête dans la base de données et récupérer tous les sous-propriétés des produits.

Je veux NHibernate envoyer une requête comme ceci:

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 mc.Id=@mediaCategoryId 

J'ai essayé les options suivantes pour résoudre ce problème;

  1. session.QueryOver< ProductEntity >()...
    J'ai essayé Inner.JoinQueryOver< .. >().Fetch.Eager... mais je ne pouvais pas récupérer toutes les sous-entités.
  2. session.CreateCriteria< ProductEntity >().SetFetchMode("",FetchMode.Eager)...
    Dans ce cas, le lazy load fonctionne et je ne veux pas lazyload. Si je désactive le lazyload de mappages NH envoie beaucoup de requêtes.. ce que je veux est désireux de charge avec une seule requête qui récupère toutes les sous-entités.
  3. session.Query< ProductEntity >().FetchMany(p=>p.MediaList).ThenFetchMany(m=>m.SellerList)...
    Je ne pouvais pas créer des alias pour passer mediaCategoryId filtre dans ce cas. Au lieu de cela j'ai utilisé .Where(x=>x.MediaList.Any(m=>m.CategoryList.Any(...))) et la requête générée n'est pas optimale, trop.
  4. (à partir de p en session.Requête< ProductEntity >()
    à partir de m en p.MediaList
    à partir de c en m.MediaCategoryList
    où c.Id==23
    sélectionnez p).Fetch(x=>x.MediaList);

    cela n'a pas fonctionné comme je le voulais, trop..

  5. var hql=@"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 ";
    CELA FONCTIONNE avec "join fetch" dans les requêtes hql.
    J'ai besoin de la meilleure pratique de ce cas, cependant Hql est le roi.

    Pouvons-nous gérer ce cas avec session.Query<>() ou session.CreateCriteria, ou QueryOver ?

Avez-vous besoin Media.MediaCategoryList de revenir peuplée? Ou avez-vous seulement de soins sur Product.MediaList et Product.SellerList?

OriginalL'auteur mecek | 2013-08-20