Come interrogare una colonna chiave esterna con NHibernate, senza recuperare l'entità correlata

StackOverflow https://stackoverflow.com/questions/8807187

  •  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?

È stato utile?

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));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top