Lazy loading и Deferred являются довольно синонимами (AFAIK, пожалуйста, исправьте меня, если я ошибаюсь). Большая разница между Eager и Lazy. Стремление будет происходить заранее, Lazy происходит только «по мере необходимости», и выполнение будет происходить на уровне базы данных - давайте возьмем простой оператор JOIN в качестве примера
var people = (from p in people SELECT p).ToList();
var jobs = (from j in jobs SELECT j).ToList();
var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList()
Это пример активной загрузки. Мы получаем ВСЕХ людей, ВСЕ рабочие места, и мы делаем соединение в памяти. Не очень умный (обычно). Вот как выглядит ленивый стиль.
var people = (from p in people SELECT p);
var jobs = (from j in jobs SELECT j);
var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList()
Это создает IQueryable как для людей, так и для работы (IQueryable ленив), и объединение происходит в БД. Это экономит сетевую активность и, как правило, на самом деле быстрее, поскольку БД оптимизирована для выполнения объединений и тому подобного.
Если мы явно не скажем "Мне нужны эти данные!" (ToListing это, повторяя это, и т. д.) это лениво. Есть еще несколько причуд, но это должен быть достойный учебник.