2010-04-28 3 views

Répondre

15

Je créerais juste un alias à la collection et ajouterais des restrictions.

var parentsWithKidName = session.CreateCriteria<Parent>() 
    .CreateAlias("Children", "c", JoinType.InnerJoin) 
    .Add(Restrictions.Eq("c.Name", childName)) 
    .SetResultTransformer(Transformers.DistinctRootEntity()) 
    .List<Parent>(); 

Cela se traduirait par

select p.* 
from parent p 
inner join child c on /* however it's mapped? */ 
where c.Name = ? 

Le transformateur de l'entité racine distincte traitera l'ensemble des résultats et de supprimer les parents dupliqués. Ils rencontrent quand même le fil.

0

Ce que je l'ai fait était de créer une requête de critères pour le type de parent, utilisez le retour pour créer une requête de critères pour le type d'enfant, puis ajoutez les conditions spécifiques au type d'enfant sous requête.

public virtual IList<T> GetByChildCriteria(string childName, 
    params ICriterion[] criterion) 
{ 
    ICriteria criteria = NHibernateSession 
    .CreateCriteria(persitentType) 
    .CreateCriteria(childName); 
    foreach (ICriterion criterium in criterion) 
    { 
     criteria.Add(criterium); 
    } 
    return criteria.List<T>(); 
} 

Remarque: La variable NHibernateSession est de type ISession.

Questions connexes