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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

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

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

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

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

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

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Как использовать EF Core со stored procedure?

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

EF Core вызывает хранимые процедуры через FromSqlRaw для SELECT с маппингом в DbSet, через ExecuteSqlRawAsync для DML без результата, и через SqlQuery<T> для скалярных значений. EF Core 7+ позволяет связать CRUD-операции с процедурами через InsertUsingStoredProcedure и аналоги.

1. Вызов SELECT-процедуры с маппингом в сущность

// Хранимая процедура SQL Server:
// CREATE PROCEDURE GetProductsByCategory @CategoryId INT
// AS SELECT * FROM Products WHERE CategoryId = @CategoryId

var categoryId = 5;
var products = await context.Products
    .FromSqlRaw("EXEC GetProductsByCategory @p0", categoryId)
    .AsNoTracking()
    .ToListAsync();

EF Core и Stored Procedures

EF Core поддерживает вызов хранимых процедур для чтения (с маппингом в сущности или DTO), DML-операций и даже может использовать процедуры для Insert/Update/Delete начиная с EF Core 7.

2. Маппинг в keyless DTO (не DbSet)

Если процедура возвращает колонки, не совпадающие с сущностью, используйте Keyless Entity:

public class ProductSummary
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public int OrderCount { get; set; }
}

// В DbContext:
modelBuilder.Entity<ProductSummary>().HasNoKey().ToView(null);

// Вызов:
var summaries = await context.Set<ProductSummary>()
    .FromSqlRaw("EXEC GetProductSummaries")
    .ToListAsync();

3. Скалярный результат через SqlQuery (EF Core 7+)

var totalRevenue = await context.Database
    .SqlQuery<decimal>($"EXEC GetTotalRevenue {DateTime.UtcNow.Year}")
    .FirstAsync();

4. DML-процедура без результата

var productId = 42;
var newPrice = 99.99m;

await context.Database.ExecuteSqlRawAsync(
    "EXEC UpdateProductPrice @p0, @p1",
    productId, newPrice);

5. Хранимые процедуры для CRUD (EF Core 7+)

EF Core 7 позволяет связать Insert/Update/Delete с конкретными процедурами через Fluent API:

modelBuilder.Entity<Product>()
    .InsertUsingStoredProcedure(
        "Product_Insert",
        spBuilder => spBuilder
            .HasParameter(p => p.Name)
            .HasParameter(p => p.Price)
            .HasResultColumn(p => p.Id))
    .UpdateUsingStoredProcedure(
        "Product_Update",
        spBuilder => spBuilder
            .HasOriginalValueParameter(p => p.Id)
            .HasParameter(p => p.Name)
            .HasParameter(p => p.Price))
    .DeleteUsingStoredProcedure(
        "Product_Delete",
        spBuilder => spBuilder
            .HasOriginalValueParameter(p => p.Id));

После этого обычный context.Products.Add(product); await context.SaveChangesAsync(); вызовет Product_Insert автоматически.

6. Передача параметров через SqlParameter

var param = new SqlParameter("@CategoryId", SqlDbType.Int) { Value = 5 };
var products = await context.Products
    .FromSqlRaw("EXEC GetProductsByCategory @CategoryId", param)
    .ToListAsync();

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

  • FromSqlRaw с процедурой нельзя дополнять .Where() или .OrderBy() — EF не может обернуть EXEC в подзапрос. Фильтрация должна быть внутри процедуры.
  • Keyless entities не отслеживаются ChangeTracker — нельзя вызывать Update() на них.
  • Имена параметров чувствительны к провайдеру: @p0 для SQL Server, позиционные параметры могут отличаться в PostgreSQL.
  • Процедуры с OUTPUT-параметрами требуют явного SqlParameter с Direction = ParameterDirection.Output и чтения значения после выполнения.
  • EF Core 7 CUD-процедуры не поддерживают все сценарии (например, оптимистичную блокировку через RowVersion) — проверяйте документацию для вашей версии.
  • Миграции не отслеживают тела хранимых процедур — изменения в процедурах нужно управлять вручную или через migrationBuilder.Sql().
  • При использовании AsNoTracking() с процедурой ChangeTracker не активен — изменения через процедуру не отразятся в уже загруженных сущностях контекста.

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

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

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

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

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

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

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

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

Источники

  • https://learn.microsoft.com/en-us/ef/core/querying/sql-queries

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

Entity Frameworkdata-access-designruntime-reasoning