Sto utilizzando Entity Framework 6 e DbContext
. Voglio desiderare di caricare i record dal database allo scopo di utilizzare questi record nel ciclo. Vorrei spiegare con un esempio (è solo un esempio, per favore non dirmi che non è realistico nel mondo reale).
Ho un DataGridView
che mostra la lista degli studenti. Nella tabella Student
, ogni record ha una colonna favorite_subject_id
.
Pur mostrando ogni record studente in DataGridView
, voglio trovare e visualizzare il nome del soggetto dal Subject
tavolo con dello studente favorite_subject_id
(diciamo non v'è alcuna relazione banca dati tra di loro. So che dovrebbe essere nel progetto del mondo reale. Ma è solo un esempio per chiarire la mia domanda).
Per prima cosa, ho sviluppato questo concetto come il seguente codice:
foreach (DataGridViewRow row in gridView.Rows)
{
if (!row.IsNewRow)
{
var student = (Student)(row.DataBoundItem);
var favorite_subject = dbContext.Subjects.find(student.favorite_subject_id);
row.Cells[colFs.Index].Value = favorite_subject.subject_name.ToString();
}
}
Ma questa implementazione del codice toccherà il database per ogni record degli studenti. Danneggerà le prestazioni.
Quindi voglio caricare con impazienza i record dei soggetti nella memoria prima del ciclo. Nel ciclo, voglio solo cercare da questi record desiderosi caricati dalla memoria. Il problema è che non so quale sia il modo giusto (migliore) per caricare i record nella memoria.
Ho scritto del codice per questo scopo. Ma non sono sicuro se sia il modo giusto di fare.
var lstSubjects = dbContext.Subjects.ToList<Subject>();
foreach (DataGridViewRow row in gridView.Rows)
{
if (!row.IsNewRow)
{
var student = (Student)(row.DataBoundItem);
var favorite_subject= lstSubjects .Find(x => x.subject_id == student.favorite_subject_id);
row.Cells[colFs.Index].Value = favorite_subject.subject_name.ToString();
}
}
Quindi la domanda è qual è il modo migliore per caricare i record dal database nella memoria (usando DbContext
)?
È possibile utilizzare Includi per eseguire il caricamento bisognoso, ma ciò può essere fatto solo se si ha una relazione di database tra tali tabelle. In tale scenario è possibile utilizzare il codice riportato di seguito.
dbContext.Students.Include(x=>x.Subjects)
presupponendo che gli studenti DbSet corrispondano alla tabella studenti e alla proprietà di navigazione Oggetti in Dbset studenti che denota la relazione.
Questo caricherà tutti gli studenti insieme a tutte le materie ad essi collegate.