Member 12688026 Ответов: 2

Какая польза от явной и ленивой загрузки?


код для ленивой загрузки:

viewModel.Enrollments = viewModel.Courses.Where(x => x.CourseID == courseID).Single().Enrollments;



код для прямой загрузки:

var selectedCourse = viewModel.Courses.Where(x => x.CourseID == courseID).Single();

db.Entry(selectedCourse).Collection(x => x.Enrollments).Load();


foreach (Enrollment enrollment in selectedCourse.Enrollments)
                  {
                      db.Entry(enrollment).Reference(x => x.Student).Load(); //explicitly loads each Enrollment entity's related student entity
                 }

                 viewModel.Enrollments = selectedCourse.Enrollments;
           }


Что я уже пробовал:

Я ничего не пробовал. Просто спрашиваю, в чем разница между этими двумя. Спасибо

Richard Deeming

Есть более простой вариант для нетерпеливой загрузки:

var selectedCourse = viewModel.Courses.Include(x => x.Enrollments.Select(e => e.Student)).Where(x => x.CourseID == courseID).Single();

Загрузка связанных сущностей - EF6 | Microsoft Docs[^]

2 Ответов

Рейтинг:
8

Vincent Maverick Durano

Существует множество дискуссий и статей, в которых говорится о различиях между ними. Вот один из них, который я нашел, суммирует разницу между ними: Нетерпеливая Загрузка, Ленивая Загрузка И Явная Загрузка В Entity Framework[^]


Рейтинг:
19

F-ES Sitecore

Lazy loading issues more SQL statements where you load the referenced data when you try and access it in code. Eager loading tends to have a single, more complex statement that loads all the data in one go. The advantage of lazy loading is mainly when you don't intended on processing all of it. For example let's say you have customers and customer orders and you only want to look at customer orders for customers with a certain property, then with lazy loading you can look at each customer and if it has the property you could then access customer.Orders and at that point Orders is loaded. That way you don't spend time getting data for all customer orders if you're not going to use it. However if you know you are going to access all data (or most of it) then there is no real use for lazy loading.

Ленивая загрузка также более полезна для настольных приложений, где код реагирует на ввод пользователя. Например, у вас может быть древовидное представление с клиентами, и когда вы разворачиваете клиента, вы затем загружаете заказы. На веб-странице, хотя у вас нет такого взаимодействия, вы создаете всю страницу за один раз, так что опять же меньше пользы для ленивой загрузки.