Новое: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 FrameworkJuniorКодинг

Что такое DbSet<T> и как его использовать?

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

DbSet<T> — это типизированный шлюз к таблице базы данных внутри DbContext. Через него выполняются LINQ-запросы, добавление, обновление и удаление сущностей типа T.

Объявление в DbContext

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

    // EF Core 6+ — рекомендуемый синтаксис
    public DbSet<Product> Products => Set<Product>();
    public DbSet<Order>   Orders   => Set<Order>();
}

Что такое DbSet<T>

DbSet<T> — свойство DbContext, представляющее коллекцию всех сущностей типа T в базе данных. Он реализует IQueryable<T>, поэтому LINQ-выражения транслируются в SQL и выполняются на стороне базы данных, а не в памяти.

Типичные операции:

  • Чтение: FindAsync, FirstOrDefaultAsync, ToListAsync, Where, Include
  • Добавление: Add / AddAsync / AddRange
  • Удаление: Remove / RemoveRange
  • Изменение выполняется через свойства отслеживаемой сущности — EF Core фиксирует разницу сам.

Основные операции

// 1. Получить по первичному ключу (сначала смотрит в кэш, потом в БД)
var product = await db.Products.FindAsync(productId);

// 2. Фильтрация — SQL WHERE на стороне БД
var cheap = await db.Products
    .Where(p => p.Price < 1000 && p.IsAvailable)
    .OrderBy(p => p.Price)
    .ToListAsync();

// 3. Добавление новой записи
var newProduct = new Product { Name = "Widget", Price = 499 };
db.Products.Add(newProduct);
await db.SaveChangesAsync(); // INSERT выполняется здесь

// 4. Обновление
var existing = await db.Products.FindAsync(productId);
if (existing is not null)
{
    existing.Price = 599;   // Change Tracker зафиксирует изменение
    await db.SaveChangesAsync(); // UPDATE
}

// 5. Удаление
var toDelete = await db.Products.FindAsync(productId);
if (toDelete is not null)
{
    db.Products.Remove(toDelete);
    await db.SaveChangesAsync(); // DELETE
}

AsNoTracking для readonly-запросов

// Если данные нужны только для отображения — отключите отслеживание.
// Это быстрее и потребляет меньше памяти.
var catalog = await db.Products
    .AsNoTracking()
    .Where(p => p.CategoryId == categoryId)
    .ToListAsync();

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

  • LINQ не всегда транслируется в SQL — вызов методов C# внутри Where (например, .ToString(), пользовательские методы) вызовет InvalidOperationException или загрузит все строки в память. Проверяйте сгенерированный SQL через LogTo или ToQueryString().
  • Материализация происходит при ToList/FirstOrDefault — до этого момента запрос — это только выражение. Добавление Where после ToListAsync() фильтрует уже загруженные данные в памяти.
  • N+1 запросов — обращение к навигационным свойствам в цикле без Include генерирует отдельный SQL на каждую итерацию.
  • Add vs Attach — Add помечает сущность как Added (будет INSERT). Если сущность уже есть в БД, используйте Attach + изменение свойств, иначе получите дубликат или ошибку уникальности.
  • Изменение detached-объекта — если объект получен вне текущего контекста (например, десериализован из JSON), Change Tracker о нём не знает. Нужно явно вызвать db.Update(entity) или db.Entry(entity).State = EntityState.Modified.
  • Параллельные запросы к одному контексту — DbSet не потокобезопасен. Нельзя запускать два await db.X.ToListAsync() через Task.WhenAll на одном DbContext.
  • Отсутствие SaveChangesAsync — Add/Remove только меняют состояние в трекере. Без SaveChangesAsync() изменения не попадут в базу данных.
  • Remove без загрузки — чтобы удалить без предварительного чтения, используйте db.Products.Where(p => p.Id == id).ExecuteDeleteAsync() (EF Core 7+), а не загрузку + Remove.

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

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

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

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

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

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

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

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

Источники

  • https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.dbset-1
←Предыдущий вопросЧто такое Fluent API в EF Core и чем он отличается от data annotations?Следующий вопрос→В чём разница между `Find()` и `FirstOrDefault()` в EF Core?

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

Entity Frameworkdata-access-designimplementationruntime-reasoning