Come fare più join con NHibernate criteri API
-
26-10-2019 - |
Domanda
Ho il seguente modello di dati:
Page
- Id // Pk
- Type // int
Section
- Id // Pk
- Page // Fk
Comment
- Id // Pk
- Section // Fk
- Date // DateTime
Sto cercando di interrogare tutti i commenti che sono associati a una determinata pagina (Say page.id = 2 e page.Type = 1) entro un limite di tempo. Ho cercato in questo modo:
var criteria = session.CreateCriteria<Comment>()
.Add(Restrictions.Eq("Section.Page.Id", pageId))
.Add(Restrictions.Eq("Section.Page.Type", pageType))
.Add(Restrictions.Ge("Date", start))
.Add(Restrictions.Lt("Date", end));
Tuttavia, questo non riesce come ottengo un errore dice "non potrebbe risolvere proprietà: Pagina di: TestNamespace.Comment". Questo normalmente indicherebbe errori di mappatura, ma funziona in tutti gli altri casi, quindi sono propenso a credere alle bugie di errore nella query.
A peggiorare le cose, Comment.Section potrebbe essere nullo, in alcuni casi (non ci sono commenti che non sono associati con una sezione, né la pagina). In questo caso voglio ignorare quei commenti.
Qualche consiglio?
Grazie!
Soluzione
var criteria = session.CreateCriteria<Comment>()
.CreateAlias("Section", "section")
.CreateAlias("section.Page", "page")
.Add(Restrictions.Eq("page.Id", pageId))
.Add(Restrictions.Eq("page.Type", pageType))
.Add(Restrictions.Ge("Date", start))
.Add(Restrictions.Lt("Date", end));
Ho aggiornato il codice di base n tuo commento. La seconda linea di specifico è stato aggiunto, e la linea 3 sta usando l'alias in 2 ° linea anziché la proprietà, e così via.
Altri suggerimenti
È possibile utilizzare le chiamate createCriteria aggiuntive per navigare attraverso la struttura del database
var criteria = session.CreateCriteria<Comment>()
.Add(Restrictions.Ge("Date", start))
.Add(Restrictions.Lt("Date", end))
.CreateCriteria("Section")
.CreateCriteria("Page")
.Add(Restrictions.Eq("Id", pageId))
.Add(Restrictions.Eq("Type", pageType));