Quando sono i record da tabelle correlate caricati con LINQ2SQL
-
21-08-2019 - |
Domanda
Diciamo che ho due tabelle:
- Rapporto
- Commento
E supponendo che ho un contesto di database:
var reports = db.Reports();
Come posso fare in modo tutti Commenti per ogni rapporto vengono caricati come bene?
A questo punto voglio staccare dal database, ma ancora avere accesso ai commenti. (Ad esempio:)
reports[0].Comments[0].Subject
Soluzione
Sto supponendo che ci sia un rapporto di 1-M FK tra le relazioni e commenti (1 Relazione può avere molti commenti)?
Una possibilità è quella di utilizzare il DataLoadOptions .LoadWith metodo - qualcosa di simile al seguente:
var reports = db.Reports();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Reports>(r => r.Comments); // Ask for Comments along with reports
reports.LoadOptions = dlo;
Ora, ogni volta che si seleziona una relazione su tale contesto i dati, i commenti che viene prelevato dal db con esso.
Proprio attenzione che verranno selezionati tutti i campi commenti -. Non c'è modo di utilizzare questo metodo per selezionare un sottoinsieme di campi
Un'altra opzione è quella di essere specifico su ciò che si desidera selezionare nella query LINQ, per es.
var myReportsList = from report in db.Reports
select new { // Using anonymous type, but could use a custom class
Report = report,
Comment = report.Comment.Detail, // for example
Subject = report.Comment.Subject
};
Per capire quando la query viene eseguita e la connessione al database chiusa, è necessario comprendere:
- Il modello di esecuzione differita Linq e LINQ to SQL (Fondamentalmente, per LINQ to SQL, la query viene eseguita solo quando i risultati sono invitati per esempio iterando la raccolta o legame di griglia)
- La differenza tra IQueryable e IEnumerable
Jon Skeets "C # in profondità" dà una grande panoramica di questi, e ho anche sentito cose molto buone su "Linq in azione" - più ci sono un sacco di post di blog su questi concetti che fanno i soggetti più giustizia di posso fare qui; o)
Altri suggerimenti
Tenga presente che se si utilizza LoadOptions per definire un percorso multi-hop (Reports, commenti, anotherentity), il 3 ° e ulteriori luppolo vengono caricati (se riferite oltre 1: n rapporti) di codice che è molto inefficiente: si 'll eseguire una query per ogni genitore. Per rapporti-commenti, è ok, saranno recuperati in 2 query.