Come interrogare una colonna chiave esterna con NHibernate, senza recuperare l'entità correlata
-
26-10-2019 - |
Domanda
Di 'Ho due classi: Parent
e Child
. Un Parent
ha una Children
proprietà, che è, naturalmente, una collezione di oggetti Child
.
Child
non ha una proprietà ParentId
. Esso ha una proprietà Parent
.
Quindi, la mia mappatura NHibernate per Child
comprende:
<many-to-one name="Parent" class="Parent" column="ParentId" cascade="save-update" />
E la mia mappatura Parent
comprende:
<bag name="children" access="field" inverse="true" cascade="all-delete-orphan">
<key column="ParentId" />
<one-to-many class="Child" />
</bag>
Ora qui è quello che voglio fare: Voglio ottenere tutti gli oggetti Child
con una certa ParentId
. So che posso ottenere il primo Parent
e poi tornare la sua proprietà Children
. Ma cosa succede se avrei voluto interrogare la tabella Child
direttamente?
Se fosse una proprietà mappata (ad esempio, Name
), ho potuto utilizzare i criteri di NHibernate, ma in questo caso, ParentId
non è mappata.
Ho provato ad utilizzare qualcosa come:
criteria.Add(Restrictions.Eq("Parent.Id", 1));
Ma questo non funziona. Ho fatto ricorso all'utilizzo di SQLCriterion (come spiegato qui ), ma un amico / collega mi ha fatto pensare ci deve essere un modo migliore.
Tutte le idee? Qualcosa con proiezioni e Restrictions.EqProperty
?
Soluzione
Ho fatto questo utilizzando query su. Ecco un esempio:
Child foundChild =
session.QueryOver<Child>()
.Where(x => x.Parent.Id == 1234).SingleOrDefault<Child>();
Altri suggerimenti
Si deve alias il percorso dell'associazione. Ciò restituirà un proxy per il genitore assumendo che utilizzano carichi pigri. È possibile accedere a proprietà Id del genitore senza innescare un carico.
return _session.CreateCriteria<Child>()
.CreateAlias("Parent", "parent")
.Add(Restrictions.Eq("parent.Id", parentId))
.List<Child>();
Credo che può essere fatto tramite Criteri in questo modo:
criteria.Add(Restrictions.Eq("Parent", Session.Load<Parent>(1));