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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python15 317
  • Облачные технологии11 893
  • QA вакансии3 403
  • Backend вакансии1 829
  • Инженер данных1 418
  • Продакт-менеджер845

Разработка

  • Android1 758
  • iOS1 639
  • AI вакансии875
  • Fullstack вакансии727
  • Frontend вакансии631
  • Mobile вакансии31

По стеку

  • Go8 413
  • Java5 383
  • Node.js1 730
  • Kotlin1 427
  • Rust1 387
  • .NET1 303
  • PHP554
  • C++394
  • C#373

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

  • Kubernetes6 666
  • Linux-инфраструктура4 922
  • DevOps вакансии4 845
  • Terraform / IaC3 701
  • Мониторинг и Observability1 698
  • CI/CD1 557
  • SRE510
  • Кибербезопасность246

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

  • Data Scientist779
  • Аналитик данных756
  • Бизнес-аналитик730
  • Системный аналитик96

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

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

По регионам

  • Вакансии в США40 526
  • Вакансии в Европе16 981
  • Вакансии в Канаде3 889
  • Работа в России3 872

По формату

  • Удалённые вакансии64 846
  • Релокация в США40 528
  • Гибридная работа9 711
  • Офисная работа6 760

По уровню

  • Senior вакансии36 345
  • Middle вакансии17 248
  • Junior вакансии5 866

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

Все компании
  • Wise193 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

В чём разница между Include() и ThenInclude()?

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

Include() загружает навигационное свойство первого уровня (прямой потомок), ThenInclude() — продолжает цепочку глубже, загружая свойства у уже загруженного объекта.

Структура модели для примеров

public class Order
{
    public int Id { get; set; }
    public Customer Customer { get; set; } = null!;
    public List<OrderItem> Items { get; set; } = new();
}

public class OrderItem
{
    public int Id { get; set; }
    public Product Product { get; set; } = null!;
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public Category Category { get; set; } = null!;
}

public class Category
{
    public int Id { get; set; }
    public string Title { get; set; } = "";
}

Include() и ThenInclude() в EF Core

Include() загружает навигационное свойство первого уровня — прямого «потомка» корневой сущности. ThenInclude() продолжает цепочку и загружает свойство уже у загруженного навигационного объекта, то есть работает на втором и последующих уровнях вложенности.

Include — первый уровень

// Загружает Customer и Items вместе с Order (2 JOIN или 2 отдельных SELECT)
var orders = await ctx.Orders
    .Include(o => o.Customer)
    .Include(o => o.Items)
    .ToListAsync();

// order.Items[0].Product будет null — не загружали глубже

ThenInclude — второй уровень

// Загружает Items, у каждого Item — Product, у Product — Category
var orders = await ctx.Orders
    .Include(o => o.Items)
        .ThenInclude(i => i.Product)
            .ThenInclude(p => p.Category)
    .Include(o => o.Customer)  // параллельная ветка — снова Include
    .AsNoTracking()
    .ToListAsync();

// Теперь order.Items[0].Product.Category.Title доступен без доп. запросов

ThenInclude() «привязан» к предыдущему Include() или ThenInclude(). Чтобы начать новую ветку (например, после Items загрузить ещё и Customer), нужно снова вызвать Include() от корневой сущности.

Include через строку (альтернативный синтаксис)

// Работает, но без статической типизации — легко опечататься
var orders = await ctx.Orders
    .Include("Items.Product.Category")
    .ToListAsync();

Когда использовать AsSplitQuery()

Если Include() нескольких коллекций порождает декартово произведение строк, добавьте AsSplitQuery(): EF Core выполнит несколько SELECT вместо одного гигантского JOIN.

var orders = await ctx.Orders
    .Include(o => o.Items).ThenInclude(i => i.Product)
    .Include(o => o.Tags)
    .AsSplitQuery()
    .AsNoTracking()
    .ToListAsync();

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

  • Порядок ThenInclude — вызов ThenInclude() после Include() коллекции (List<T>) работает правильно только если передать лямбду типа элемента, а не коллекции.
  • Дублирование данных — без AsSplitQuery() включение двух коллекций создаёт M×N строк в результирующем наборе и повышает трафик.
  • Фильтрация включений — с EF Core 5+ можно фильтровать: .Include(o => o.Items.Where(i => !i.Deleted)), но AsSplitQuery() в этом случае не поддерживается.
  • Include игнорируется при проекции — если добавить .Select(...) после Include(), EF Core проигнорирует Include() и сам определит нужные JOIN по полям Select.
  • Circular reference при сериализации — двунаправленные навигационные свойства плюс eager loading приводят к зацикливанию JSON.NET; используйте ReferenceHandler.IgnoreCycles или DTO.
  • N+1 при отсутствии Include — если убрать Include(), а lazy loading не включён, обращение к навигационному свойству вернёт null, а не выполнит запрос.

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

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

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

  • Кандидат объясняет Include и ThenInclude для графа связанных сущностей на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

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

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

Источники

  • https://learn.microsoft.com/en-us/ef/core/querying/related-data/eager
←Предыдущий вопросПредставьте, после изменения кода на Entity Framework выросло число SQL-запросов и latency. Как вы будете это доказывать и чинить?Следующий вопрос→Какие ошибки делают команды, когда прячут сложность базы данных за Entity Framework?

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

Entity Frameworkdata-access-designimplementationruntime-reasoning

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

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