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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 196
  • Облачные технологии14 160
  • QA вакансии3 451
  • Backend вакансии2 107
  • Инженер данных1 800
  • Продакт-менеджер1 247

Разработка

  • Android1 855
  • iOS1 695
  • Fullstack вакансии995
  • AI вакансии952
  • Frontend вакансии751
  • Mobile вакансии43

По стеку

  • Go8 754
  • Java6 595
  • Node.js2 038
  • .NET1 738
  • Kotlin1 617
  • Rust1 473
  • C#718
  • PHP692
  • C++582

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

  • Kubernetes7 778
  • DevOps вакансии6 088
  • Linux-инфраструктура5 502
  • Terraform / IaC4 276
  • CI/CD3 275
  • Мониторинг и Observability1 793
  • SRE563
  • Кибербезопасность453

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

  • Data Scientist1 141
  • Бизнес-аналитик921
  • Аналитик данных860
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 164
  • Вакансии в Европе24 016
  • Вакансии в Канаде4 533
  • Работа в России3 837

По формату

  • Удалённые вакансии75 134
  • Релокация в США44 163
  • Гибридная работа12 456
  • Офисная работа7 066

По уровню

  • Senior вакансии42 633
  • Middle вакансии20 971
  • Junior вакансии6 706

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

В чём разница между AsNoTracking() и отслеживаемыми запросами, и когда использовать каждый вариант?

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

AsNoTracking() отключает слежение за сущностями в ChangeTracker: EF Core не делает снимок и не регистрирует изменения. Используйте для read-only запросов — экономит память и CPU. Для операций записи нужен отслеживаемый запрос.

Как работает AsNoTracking()

AsNoTracking() — расширяющий метод из пространства имён Microsoft.EntityFrameworkCore, который устанавливает QueryTrackingBehavior.NoTracking для конкретного запроса. EF Core материализует сущности в памяти, но не кладёт их в ChangeTracker, не делает snapshot и не строит identity map для этого запроса. Результат: меньше аллокаций, быстрее выполнение, никакого влияния на SaveChangesAsync().

// Пример: read-only список для страницы каталога
var products = await context.Products
    .AsNoTracking()
    .Where(p => p.CategoryId == categoryId && p.IsActive)
    .OrderBy(p => p.Name)
    .Select(p => new ProductDto(p.Id, p.Name, p.Price))
    .ToListAsync(cancellationToken);

Можно также задать поведение глобально для контекста через DbContextOptionsBuilder:

services.AddDbContext<AppDbContext>(opts =>
    opts.UseNpgsql(connectionString)
        .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));

При глобальном NoTracking отслеживание для конкретного запроса можно вернуть через AsTracking().

Что такое change tracking и зачем он нужен

По умолчанию EF Core регистрирует каждую загруженную сущность в ChangeTracker. При вызове SaveChangesAsync() EF сравнивает текущее состояние объектов со снимком, сделанным в момент загрузки, и генерирует UPDATE/INSERT/DELETE только там, где есть расхождения. Это удобно для сценариев редактирования, но дорого обходится при чтении — создаётся снимок каждой строки, объекты помещаются в словарь identity map, и при большом результирующем наборе давление на GC заметно растёт.

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

  • Страницы списков, каталоги, отчёты — любое чтение без последующей записи через тот же DbContext.
  • API-эндпоинты, возвращающие DTO: объекты всё равно отображаются в другой тип, tracking бесполезен.
  • Фоновые задачи, генерирующие большие выборки (тысячи строк).
  • Сценарии с коротким lifetime контекста (scoped per request) — экономия заметна при сотнях запросов в секунду.

Когда нужен отслеживаемый запрос

  • Загрузка сущности с намерением изменить её и сохранить через SaveChangesAsync().
  • Использование identity map: два запроса возвращают одну и ту же строку — EF возвращает один и тот же экземпляр объекта.
  • Каскадные операции: EF автоматически отслеживает связанные сущности и применяет правила cascade delete.
// Пример отслеживаемого запроса для обновления
var order = await context.Orders
    .Include(o => o.Items)
    .FirstOrDefaultAsync(o => o.Id == orderId, cancellationToken);

if (order is null)
    return Results.NotFound();

order.Status = OrderStatus.Confirmed;
order.ConfirmedAt = DateTime.UtcNow;

await context.SaveChangesAsync(cancellationToken);

AsNoTrackingWithIdentityResolution()

EF Core 5+ добавил промежуточный режим: AsNoTrackingWithIdentityResolution(). Он не регистрирует сущности в ChangeTracker, но всё же строит локальный identity map в рамках одного запроса. Это нужно, когда результат содержит повторяющиеся строки (например, JOIN с коллекцией), и вы хотите получить единственный экземпляр объекта вместо дублей. Стоимость — дополнительная аллокация под временный словарь.

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

  • Неожиданное поведение Attach/Update. Если загрузить сущность через AsNoTracking(), а потом передать её в context.Update(entity), EF пометит все свойства как Modified и обновит каждое поле, даже неизменённое. Это генерирует избыточный UPDATE и может перезаписать чужие изменения.
  • Lazy loading не работает. Lazy-навигации (virtual свойства с прокси) требуют отслеживания. При NoTracking прокси не создаются или не работают — связанные коллекции останутся null.
  • Глобальный NoTracking и случайные записи. Если установить UseQueryTrackingBehavior(NoTracking) глобально, а потом забыть добавить AsTracking() там, где нужна запись, SaveChangesAsync() молча ничего не сохранит — сущности не в трекере.
  • Дубли при Include без IdentityResolution. Запрос с Include на коллекцию и AsNoTracking() может вернуть дублированные родительские объекты, если не использовать AsNoTrackingWithIdentityResolution() или AsSplitQuery().
  • Мнимая экономия при Select в DTO. Если вы проецируете результат в DTO через Select(), EF Core и так не создаёт отслеживаемые сущности — tracking тут не применяется. AsNoTracking() в этом случае не даёт прироста.
  • Snapshot при автоматическом detect changes. По умолчанию EF Core вызывает DetectChanges() перед сохранением. При большом числе отслеживаемых сущностей это O(n) операция. AsNoTracking() — правильное решение, но альтернатива — отключить автоматический DetectChanges и вызывать вручную.
  • Thread safety. DbContext не потокобезопасен. AsNoTracking() не решает эту проблему — один контекст нельзя использовать из нескольких потоков одновременно.
  • Версионная разница EF6 vs EF Core. В EF6 метод называется AsNoTracking() на уровне DbQuery, поведение схоже, но API конфигурации и возможности (например, AsNoTrackingWithIdentityResolution) существуют только в EF Core.

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

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

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

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

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

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

Источники

  • https://learn.microsoft.com/en-us/ef/core/querying/tracking
←Предыдущий вопросВ чём разница между `Find()` и `FirstOrDefault()` в EF Core?Следующий вопрос→Как обрабатывать конфликты параллельного доступа (concurrency conflicts) в EF Core?

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

Entity Frameworkdata-access-designperformance-debuggingruntime-reasoning

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

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