5

Ho il seguente modello di dati:Come fare multipla si unisce con NHibernate criteri API

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 pagina .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 che l'errore si trovi nella query.

Per peggiorare le cose, Comment.Section potrebbe essere nullo in alcuni casi (ci sono commenti che non sono associati a una sezione o pagina). In tal caso, voglio ignorare quei commenti.

Qualche consiglio?

Grazie!

+0

può aggiungere la definizione per il tipo di perdita che il criterio si basa su? – Richard

+0

Um, ho copiato quel codice da qualche parte..lasso dovrebbe essere un commento in realtà. Ho modificato il post e corretto l'errore. – user315648

risposta

4
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 in base al tuo commento. La seconda riga è stata specificatamente aggiunta e la terza riga utilizza l'alias in 2a riga anziché la proprietà e così via.

+0

Che dà un errore: ERRORE: 42P01: manca la clausola FROM per la tabella – user315648

+0

Controllare la risposta aggiornata per favore. – Meligy

+0

Funziona ora! Grazie! – user315648

0

È possibile utilizzare ulteriore createCriteria chiama a 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));