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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top