Эффективные запросы LINQ в C#

LINQ для разработчиков уровня middle, которые пришли в C# из других языков: как устроены операторы, что происходит при перечислении, как запрос превращается в SQL и где LINQ стоит дорого. Двенадцать глав на C# 15 и .NET 11 вокруг одного рабочего проекта — сервиса сверки платежей.
Средний уровень
4–6 часов в неделю
Сертификат Stepik

Чему вы научитесь

  • Читать конвейер LINQ как описание преобразования и предсказывать, когда и сколько раз выполнится каждый оператор
  • Выбирать оператор под задачу: GroupBy против ToLookup, Join против HashSet, MaxBy против сортировки, CountBy и AggregateBy вместо группировки
  • Писать соединения и операции над множествами с правильными comparer, включая LeftJoin и FullJoin
  • Создавать собственные операторы на yield и extension-блоках с проверкой ленивости в тестах
  • Измерять стоимость конвейера BenchmarkDotNet и решать, где LINQ заменить циклом или Span
  • Строить деревья выражений для динамических фильтров и сортировок и понимать границы их трансляции
  • Писать запросы EF Core, которые переводятся в один SQL, и проверять это через ToQueryString
  • Работать с асинхронными потоками, отменой, PLINQ и каналами в конвейерах загрузки данных
  • Проектировать слой данных сервиса без утечки IQueryable наружу, с read-моделями и keyset-пагинацией
  • Проводить ревью LINQ-кода по чек-листу и находить антипаттерны, которые не ловят анализаторы

О курсе

payments.Where(p => lines.Any(l => l.Ref == p.Ref)) работает мгновенно на тестовых данных и минуты — на ста тысячах платежей. db.Orders.AsEnumerable().Where(...) читает всю таблицу в память, и никто этого не замечает, пока таблица маленькая. Тот же IEnumerable перечисляется дважды, и файл выписки читается дважды. LINQ прост в первый день и полон таких ловушек в первый год; курс — о механизмах, которые за ними стоят.

Что внутри

Двенадцать глав, 109 уроков. Первые две — модель: IEnumerable, делегаты, отложенное выполнение, yield, повторное перечисление. Главы с третьей по пятую — операторы: фильтрация и проекция, группировка и агрегаты, соединения (включая LeftJoin и FullJoin из .NET 10–11) и операции над множествами. Шестая — собственные операторы и extension-блоки C# 14. Седьмая — коллекции, аллокации и BenchmarkDotNet. Восьмая — expression trees, IQueryable и динамические фильтры. Девятая — EF Core 11: перевод в SQL, проекции, трекинг, ExecuteUpdate, compiled queries. Десятая — IAsyncEnumerable, PLINQ и Channels. Одиннадцатая — LINQ в архитектуре сервиса: граница IQueryable, read-модели, keyset-пагинация, Minimal API, потоковый экспорт, наблюдаемость. Двенадцатая — антипаттерны, анализаторы, null-безопасность, LINQ над XML и JSON, код-ревью.

Сквозной проект

Все главы строят один сервис — Tally, сверку реестра платежей с выписками платёжных провайдеров. Он читает CSV потоком, сопоставляет платежи со строками выписок многоэтапным алгоритмом на FullJoin, Join и ExceptBy, считает комиссии, хранит расхождения в SQLite через EF Core, отдаёт их через HTTP API с фильтрами и курсорной пагинацией и экспортирует потоком. Каждый урок ссылается на конкретные файлы проекта; проект собирается, покрыт тестами на xunit v3 и бенчмарками.

Метод

Основа урока — код с разбором механизма: что делает оператор, когда он выполняется, что аллоцирует, во что транслируется. Описательных абзацев минимум. Каждый урок заканчивается практическим заданием на проекте и вопросами для самопроверки; каждая глава — практикой, где написанное собирается в рабочий фрагмент Tally. Главы с третьей по десятую завершаются тестовыми задачами с объяснением после неверного ответа.

Чего в курсе нет

Введения в C# и .NET, объектно-ориентированного проектирования, устройства SQL и реляционных баз — предполагается, что это известно из предыдущего языка. Нет и обзора «всех способов писать запросы»: курс строго о LINQ, его операторах и механизмах, рекомендуемых актуальной документацией .NET.

Как проходит обучение

Текстовые уроки с кодом, задания выполняются локально в проекте Tally на .NET 11 SDK. Дедлайнов нет. Курс проходится последовательно: главы опираются друг на друга и на растущий проект.

Для кого этот курс

Backend- и системные разработчики уровня middle, которые перешли в C# из Python, Java, Kotlin, JavaScript, Go или Rust и уже пишут на нём, но LINQ используют по аналогии с привычными map/filter. C#-разработчики, которым нужно понять, почему запросы медленные, почему EF Core не переводит выражение или почему результат отличается от ожидаемого. Курс не подойдёт тем, кто только начинает программировать или ещё не знаком с C#.

Начальные требования

  • Уверенное программирование на любом backend-языке: коллекции, функции высшего порядка, интерфейсы, базовый SQL
  • Базовый синтаксис C#: классы, методы, лямбды, generics — глубокого знания не требуется
  • Установленный .NET 11 SDK и редактор (VS Code с C# Dev Kit, Rider или Visual Studio)
  • Умение работать с командной строкой и dotnet CLI

Наши преподаватели

Программа курса

загружаем...
Certificate

Сертификат

Сертификат Stepik

Что вы получаете

  • Проект Tally: сервис сверки платежей на .NET 11 с CLI, HTTP API, тестами и бенчмарками, который собирается и запускается на своих данных
  • Библиотеку собственных операторов LINQ: Windowed, Pairwise, RunningTotal, DistinctUntilChanged, GroupAdjacent, TakeUntil
  • Готовые компоненты для сервиса: динамические фильтры и сортировка на expression trees, спецификации, курсорная пагинация, потоковый экспорт
  • Каталог антипаттернов LINQ с заменами и чек-лист код-ревью
  • Настройку анализаторов .NET для LINQ в .editorconfig
  • Шпаргалку соответствий операторов LINQ для Python, Java, Kotlin, JavaScript, Rust и Go

Сколько стоит обучение

Price: 999 
Вы попробовали и поняли, что вам сейчас не подходит этот курс? Ничего страшного, мы вернём вам деньги в течение 30-ти дней после покупки.

Часто задаваемые вопросы

Расскажите о курсе друзьям

Price: 999