2010-04-12 3 views
1

J'ai un problème de requête nHibernate qui semble assez simple, mais je n'arrive pas à le contourner!Requête NHibernate à la recherche de l'objet apparenté de l'objet

Je crée des classes d'exemple simple pour illustrer mon problème:

public class Car { 
    public int Id { get; set; } 
    public IList<Interior> InteriorParts { get; set; } 
} 

public class Interior { 
    public int Id { get; set; } 
    public InteriorProducer Producer { get; set; } 
} 

public class InteriorProducer { 
    public int Id { get; set; } 
} 

maintenant à la requête: je l'id du InteriorProducer, mais ont besoin d'obtenir une liste des voitures où l'intérieur ont été produits par le producteur de l'intérieur.

Ainsi, dans un simple pseudo SQL, il ressemble à ceci:

select cars 
where car.InteriorParts.Producer.Id = Id 

J'ai vraiment du mal à obtenir ma tête autour de cela pour créer une requête NHibernate.

Des idées?

Merci

Répondre

3
var cars = session 
    .CreateCriteria<Car>() 
    .CreateAlias("InteriorParts", "parts") 
    .CreateAlias("parts.Producer", "producer") 
    .Add(Expression.Eq("producer.Id", id)) 
    .List(); 

En fonction de votre cas, vous pouvez également filtrer les voitures en double qui seront rapatriées en raison de SQL Jointures:

.SetResultTransformer(Transformers.DistinctRootEntity) 
2

et hql ...

var query = session.CreateQuery 
    ("select c from Cars c where c.InteriorParts.Producer.Id = :pid"); 
query.SetInt32("pid", producerId); 
IList<Car> cars = query.List<Car>(); 
+0

thx moo, a oublié de le taguer correctement – Jaguar

Questions connexes