Non puoi mai sapere come gli utenti prevedono di utilizzare il tuo codice. Nella tua proposta, se un chiamante cerca prima HasNotes
e solo più tardi Notes
, avrai anche una chiamata SQL troppe: prima il COUNT e poi l'intero SELECT per popolare Notes
.
Se sai che gli utenti non chiameranno mai HasNotes
prima di Notes
, allora la tua implementazione ha senso, ma in tal caso, ti suggerirei di andare fino in fondo in quella direzione.
Ad esempio, invece di cercare di essere intelligenti sulle query indovinando i modelli di utilizzo in un modello, è possibile creare un livello di accesso ai dati esplicito che esegua esattamente le query giuste necessarie e compila le classi del modello. Le classi modello vengono quindi ridotte a semplici classi di data holder. Potrebbero contenere la logica di dominio e la logica di convalida e tutto ciò, ma certamente nessuna conoscenza del DB.
Questo è davvero il dibattito ORM vs DAO. Fowler ha una breve discussione di questo dibattito qui .
In generale, sceglierei un approccio chiaro:
- Cerca di essere il più intelligente possibile nelle classi di modelli. Questo è il modo NHibernate. Produce un livello di modello di facile utilizzo che genera solo alcune query troppe. In tal caso, lascia la roba intelligente su NHibernate e non cercare di ottimizzare le classi del tuo modello prematuramente.
- Non provi nemmeno a essere intelligente, ma lasciala all'utente per chiamare i giusti metodi che popolano il modello.
Sento che l'approccio che suggerisci è da qualche parte nel mezzo ("È un'ottimizzazione, ma solo se chiami le cose così e così"). Questo confonderà gli altri sviluppatori e te stesso in pochi mesi. Meglio prendere una posizione chiara.