Qual è il modo consigliato per restituire dati ad hoc (personalizzati caso per caso) dal repository che non si adattano ad alcuna entità modello o che ne estendono alcuni?Schema di dati e repository ad hoc
L'esempio 101 sarebbe l'onnipresente applicazione della parola ciao: un sistema di blog. Supponiamo di voler caricare un elenco di post in cui la voce post ha alcune informazioni aggiuntive che non esistono nell'entità Post. Diciamo che è il numero di commenti e la data e l'ora dell'ultimo commento. Questo sarebbe molto banale se si stesse usando il semplice vecchio SQL e leggendo i dati direttamente dal database. Come faccio a farlo in modo ottimale usando il modello di repository se non posso permettermi di caricare l'intera collezione di commenti per ogni post, e voglio farlo in un colpo di database? C'è qualche schema comunemente usato per questa situazione? Ora immagina di avere un'applicazione web moderatamente complessa in cui ogni pagina richiede dati personalizzati leggermente diversi e non è possibile caricare gerarchie complete (prestazioni, requisiti di memoria, ecc.).
Alcune idee casuali:
aggiungere un elenco di oggetti da ogni modello che potrebbe essere popolato dai dati personalizzati.
Sottoclasse le entità del modello caso per caso e creare lettori personalizzati per ciascuna sottoclasse.
Utilizzare LINQ, comporre query ad hoc e leggere classi anonime.
Nota: ho chiesto un similar question recently, ma sembrava di essere troppo generico e non attirare molta attenzione.
Esempio:
Sulla base di suggerimenti in risposte di seguito, sto aggiungendo un esempio più concreto. Qui è la situazione che stava cercando di descrivere:
IEnumarable<Post> posts = repository.GetPostsByPage(1);
foreach (Post post in posts)
{
// snip: push post title, content, etc. to view
// determine the post count and latest comment date
int commentCount = post.Comments.Count();
DateTime newestCommentDate = post.Comments.Max(c => c.Date);
// snip: push the count and date to view
}
Se non faccio nulla in più e utilizzare un largo della piattaforma ORM, questo si tradurrà a n + 1 query o, eventualmente, una query di carico tutti i post e commenti . Ma in modo ottimale, mi piacerebbe essere in grado di eseguire solo uno SQL che restituirebbe una riga per ogni post incluso il titolo del post, il corpo ecc. E il conteggio dei commenti e la data di commento più recente nella stessa. Questo è banale in SQL. Il problema è che il mio repository non sarà in grado di leggere e adattare questo tipo di dati al modello. Dove vanno le date massime e il conteggio?
Non sto chiedendo come farlo. Puoi sempre farlo in qualche modo: aggiungi metodi aggiuntivi al repository, aggiungi nuove classi, entità speciali, usa LINQ ecc., Ma suppongo che la mia domanda sia la seguente. Come mai il modello di repository e il corretto sviluppo guidato dal modello sono così ampiamente accettati, ma non sembrano affrontare questo caso apparentemente molto comune e di base.
Grazie per avermi indicato. Ho aggiunto un semplice esempio concreto e ulteriori spiegazioni. –