Entity Framework - нетерпеливая загрузка

Активная загрузка - это процесс, при котором запрос для одного типа сущности также загружает связанные сущности как часть запроса. Активная загрузка достигается за счет использованияInclude method.

Это означает, что запрашиваемые связанные данные будут возвращены вместе с результатами запроса из базы данных. Существует только одно соединение с источником данных, больший объем данных возвращается в первоначальном запросе.

Например, опрашивая студентов, загружайте их записи. Студенты и их зачисления будут извлечены в одном запросе.

Давайте посмотрим на следующий пример, в котором все студенты с их соответствующими зачислениями извлекаются из базы данных с помощью активной загрузки.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {
         // Load all students and related enrollments
         var students = context.Students
            .Include(s ⇒ s.Enrollments).ToList();
			
         foreach (var student in students) {
            string name = student.FirstMidName + " " + student.LastName;
            Console.WriteLine("ID: {0}, Name: {1}", student.ID, name);
				
            foreach (var enrollment in student.Enrollments) {
               Console.WriteLine("Enrollment ID: {0}, Course ID: {1}", 
                  enrollment.EnrollmentID, enrollment.CourseID);
            }
         }

         Console.ReadKey();
      }
   }
}

Когда приведенный выше код скомпилирован и выполнен, вы получите следующий результат.

ID: 1, Name: Ali Alexander
       Enrollment ID: 1, Course ID: 1050
       Enrollment ID: 2, Course ID: 4022
       Enrollment ID: 3, Course ID: 4041
ID: 2, Name: Meredith Alonso
       Enrollment ID: 4, Course ID: 1045
       Enrollment ID: 5, Course ID: 3141
       Enrollment ID: 6, Course ID: 2021
ID: 3, Name: Arturo Anand
       Enrollment ID: 7, Course ID: 1050
ID: 4, Name: Gytis Barzdukas
       Enrollment ID: 8, Course ID: 1050
       Enrollment ID: 9, Course ID: 4022

Ниже приведены некоторые из других форм запросов активной загрузки, которые можно использовать.

// Load one Student and its related enrollments

var student1 = context.Students
   .Where(s ⇒ s.FirstMidName == "Ali")
   .Include(s ⇒ s.Enrollments).FirstOrDefault();

// Load all Students and related enrollments
// using a string to specify the relationship

var studentList = context.Students
   .Include("Enrollments").ToList();

// Load one Student and its related enrollments
// using a string to specify the relationship

var student = context.Students
   .Where(s ⇒ s.FirstMidName == "Salman")
   .Include("Enrollments").FirstOrDefault();

Несколько уровней

Также можно быстро загрузить несколько уровней связанных сущностей. Следующие запросы показывают примеры студентов, зачислений и курса.

// Load all Students, all related enrollments, and all related courses

var studentList = context.Students
   .Include(s ⇒ s.Enrollments.Select(c ⇒ c.Course)).ToList();

// Load all Students, all related enrollments, and all related courses
// using a string to specify the relationships

var students = context.Students
   .Include("Enrollments.Course").ToList();

Мы рекомендуем вам выполнить приведенный выше пример поэтапно для лучшего понимания.