Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Entity FrameworkВсе вопросы
Entity FrameworkMiddleТеория

В чём разница между eager loading, lazy loading и explicit loading?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Eager loading загружает связанные данные сразу через Include(); lazy loading — автоматически при первом обращении (N+1 риск); explicit loading — вручную через Entry().Collection().LoadAsync() по требованию.

Модель для примеров

public class Blog
{
    public int Id { get; set; }
    public string Url { get; set; } = "";
    public virtual ICollection<Post> Posts { get; set; } = new List<Post>();
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
    public int BlogId { get; set; }
    public virtual Blog Blog { get; set; } = null!;
    public virtual ICollection<Comment> Comments { get; set; } = new List<Comment>();
}

Стратегии загрузки связанных данных в EF Core

EF Core предоставляет три способа загрузки навигационных свойств: eager loading, lazy loading и explicit loading. Выбор стратегии определяет, когда и сколько SQL-запросов выполняется.

Eager Loading — жадная загрузка

Все нужные данные загружаются одним (или несколькими при AsSplitQuery) SQL-запросом прямо в момент выполнения LINQ-запроса. Используются методы Include() и ThenInclude().

// 1 запрос с JOIN:
var blogs = await ctx.Blogs
    .Include(b => b.Posts)
        .ThenInclude(p => p.Comments)
    .AsNoTracking()
    .ToListAsync();

// Доступ без доп. запросов:
foreach (var blog in blogs)
    foreach (var post in blog.Posts)
        Console.WriteLine(post.Comments.Count);

Плюсы: предсказуемое количество запросов, хорошо работает с AsNoTracking(). Минусы: загружает данные, даже если они не нужны; при множестве коллекций может дать декартов взрыв.

Lazy Loading — ленивая загрузка

Навигационное свойство загружается автоматически при первом обращении к нему, по отдельному SQL-запросу на каждое обращение. Требует либо прокси-классов, либо инъекции ILazyLoader.

// Включение через прокси (пакет Microsoft.EntityFrameworkCore.Proxies):
services.AddDbContext<AppDbContext>(options =>
    options.UseLazyLoadingProxies()
           .UseSqlServer(connectionString));

// Свойства должны быть virtual:
public class Blog
{
    public int Id { get; set; }
    public virtual ICollection<Post> Posts { get; set; } = new List<Post>();
}

// Использование:
var blog = await ctx.Blogs.FirstAsync(b => b.Id == 1);
// SQL выполняется здесь, при первом обращении к Posts:
var count = blog.Posts.Count; // SELECT * FROM Posts WHERE BlogId = 1

Плюсы: простота в коде — не нужно думать о Include. Минусы: N+1, не работает с AsNoTracking() + dispose контекста, незаметно генерирует лишние запросы.

Explicit Loading — явная загрузка

Связанные данные загружаются вручную через ctx.Entry(...).Collection(...).LoadAsync() или .Reference(...).LoadAsync(), только когда это действительно нужно.

var blog = await ctx.Blogs.FirstAsync(b => b.Id == 1);

// Явная загрузка коллекции с фильтром:
await ctx.Entry(blog)
    .Collection(b => b.Posts)
    .Query()
    .Where(p => p.Title.Contains("EF"))
    .LoadAsync();

// Явная загрузка reference:
var post = await ctx.Posts.FirstAsync(p => p.Id == 42);
await ctx.Entry(post)
    .Reference(p => p.Blog)
    .LoadAsync();

Console.WriteLine(post.Blog.Url); // уже загружено

Плюсы: полный контроль, можно фильтровать загружаемые данные, полезно при условной загрузке. Минусы: verbose-код, легко забыть загрузить нужное свойство.

Сравнительная таблица

  • Eager: запросы при материализации, подходит для API/отчётов с известным набором данных.
  • Lazy: запросы при первом обращении, удобен в прототипах, опасен в продакшне без контроля.
  • Explicit: запросы по требованию с фильтрацией, идеален для условных сценариев и оптимизации.

Подводные камни

  • Lazy loading + closed context — если DbContext уже disposed (например, после выхода из using), обращение к ненагруженному навигационному свойству выбросит ObjectDisposedException.
  • Lazy loading и async — прокси EF Core не поддерживают асинхронную ленивую загрузку; при обращении к свойству внутри async метода происходит синхронный блокирующий вызов.
  • N+1 в цикле — даже при explicit loading, если вызвать LoadAsync() внутри цикла по сущностям, получится N запросов; лучше использовать eager с Include.
  • AsNoTracking и lazy loading несовместимы — AsNoTracking() отключает трекинг, а прокси для ленивой загрузки требуют отслеживаемую сущность.
  • Circular navigation при сериализации — двунаправленные свойства, загруженные eager/explicit, вызывают бесконечную рекурсию в JSON.NET без ReferenceHandler.IgnoreCycles.
  • Include игнорируется при Select — если после Include() идёт .Select(), EF Core игнорирует Include и строит JOIN сам по полям проекции.
  • Фильтрованный Include не работает с AsSplitQuery — .Include(b => b.Posts.Where(p => p.Published)) и .AsSplitQuery() несовместимы и выбросят исключение.

Частые вопросы на собеседовании

  • Как предотвратить проблему N+1 запросов в Entity Framework?
  • Как работают migration в EF Core? Как создавать и применять их?
  • Как сравнить Entity Framework с raw SQL, query builder и другими ORM по контролю, типобезопасности и производительности?
  • Когда Entity Framework ускоряет разработку, а когда ORM-абстракция начинает мешать понимать базу данных?

Типичные ошибки

  • Путать eager, lazy и explicit loading related data с похожим механизмом из другой версии или платформы.
  • Игнорировать runtime-границы Entity Framework: lifecycle, DI scope, SQL translation, UI thread или platform API.
  • Не обсуждать null/empty/error cases и поведение под нагрузкой.

Что проверяет интервьюер

  • Кандидат объясняет eager, lazy и explicit loading related data на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

Как вы знаете этот вопрос?

Проверить себя по теме Entity Framework →

Источники

  • https://learn.microsoft.com/en-us/ef/core/querying/related-data/
←Предыдущий вопросКак работают migration в EF Core? Как создавать и применять их?Следующий вопрос→Как сравнить Entity Framework с raw SQL, query builder и другими ORM по контролю, типобезопасности и производительности?

Связанные темы

Entity Frameworkdata-access-designruntime-reasoning