我正在使用Entity Framework 6和DbContext
。我想急切地从数据库加载记录,以便在循环中使用这些记录。我想用例子来解释(这只是一个例子,请不要说我在现实世界中是不现实的。)
我有一个显示学生名单的DataGridView
。在Student
表中,每条记录都有一列favorite_subject_id
。
在DataGridView
中显示每个学生记录时,我想在Subject
表中找到并显示学生favorite_subject_id
的主题名称(假设他们之间没有数据库关系)我知道这应该是在现实世界的项目中。但这只是一个清除我的问题的例子。)
首先,我将此概念开发为以下代码:
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();
}
}
但是这个代码实现将触及每个学生记录的数据库。它会损害性能。
所以我想在循环之前将主题记录加载到内存中。在循环中,我只想从内存中搜索这些急切加载的记录。问题是我不知道哪种方法是将记录加载到内存中的正确(最佳)方式。
我为此目的编写了一些代码。但我不确定这是否正确。
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();
}
}
所以问题是哪种方法是将记录从数据库急切加载到内存中的最佳方式(使用DbContext
)?
答案 0 :(得分:1)
您可以使用Include进行预先加载,但只有在表之间存在数据库关系时才能执行此操作。在该方案中,您可以使用以下代码。
dbContext.Students.Include(x=>x.Subjects)
假设您有与学生表对应的DbSet学生和学生dbset中的主题导航属性,表示关系。
这将加载所有学生以及与他们相关的所有科目。