Я ждал эту фичу 4 года и вот наконец она появляется в EF Core 10
EF Core 10 приносит серьёзное улучшение в метод
Раньше, чтобы сделать динамическое обновление, нужно было вручную собирать сложные и склонные к ошибкам expression tree'и.
Например: ты хочешь обновить поле
Раньше это значило писать довольно громоздкую логику вручную через expression API.
✅ Теперь — всё стало намного проще:
↳ можно просто использовать обычную лямбду, внутри которой разрешены
это улучшение делает код гораздо читаемее, поддерживаемее и снижает риск багов, связанных с ручной генерацией выражений.
Ждёшь эту фичу так же, как и я?
Дай знать, что думаешь👍
👉 @KodBlog
EF Core 10 приносит серьёзное улучшение в метод
ExecuteUpdateAsync
Раньше, чтобы сделать динамическое обновление, нужно было вручную собирать сложные и склонные к ошибкам expression tree'и.
Например: ты хочешь обновить поле
Views
у блога и, при определённом условии, ещё и Name
.Раньше это значило писать довольно громоздкую логику вручную через expression API.
↳ можно просто использовать обычную лямбду, внутри которой разрешены
if
и другие управляющие конструкции.это улучшение делает код гораздо читаемее, поддерживаемее и снижает риск багов, связанных с ручной генерацией выражений.
Ждёшь эту фичу так же, как и я?
Дай знать, что думаешь
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23❤2
Если ты используешь GUID'ы в C# коде, тебе наверняка понравится нововведение в .NET 9: GUID версии 7.
GUID — глобально уникальный идентификатор) гарантирует уникальность значений между разными источниками.
В предыдущих версиях C# новые записи вставлялись в случайные позиции, что приводило к фрагментации индексов.
В .NET 9 появилась поддержка GUID версии 7, которые создаются последовательно.
Благодаря этому GUID теперь лучше подходят для использования в реляционных базах данных.
Кроме того, при генерации нового GUID теперь можно передать
Ты уже начал использовать GUID версии 7?😏
👉 @KodBlog
GUID — глобально уникальный идентификатор) гарантирует уникальность значений между разными источниками.
В предыдущих версиях C# новые записи вставлялись в случайные позиции, что приводило к фрагментации индексов.
В .NET 9 появилась поддержка GUID версии 7, которые создаются последовательно.
Благодаря этому GUID теперь лучше подходят для использования в реляционных базах данных.
Кроме того, при генерации нового GUID теперь можно передать
DateTimeOffset
, чтобы задать собственное значение временной метки.Ты уже начал использовать GUID версии 7?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤8
Чувствуешь, что отстаёшь в .NET?
Вот 10 лучших статей, которые помогут быстро наверстать:
👉 @KodBlog
Вот 10 лучших статей, которые помогут быстро наверстать:
🔸 Дорожная карта .NET-разработки на 2025 год (минималистичная версия)
↳ https://devsecrets.net/post/net-development-roadmap-minimalist-edition/🔸 10 фатальных ошибок .NET-разработчиков
↳ https://devsecrets.net/post/10-fatal-mistakes-net-developers-make/🔸 MediatR? Не в моём .NET-стеке
↳ https://devsecrets.net/post/mediatr-not-in-my-net-stack/🔸 Ноль опыта с Azure? Начни отсюда
↳ https://devsecrets.net/post/zero-azure-cloud-experience/🔸 Модульный монолит — архитектурный паттерн, о котором все забывают
↳ https://devsecrets.net/post/modular-monolith/🔸 Как справляться с неопределённостью при проектировании систем
↳ https://devsecrets.net/post/how-to-beat-uncertainty-when-designing-systems/🔸 7 мощных методов LINQ, о которых ты пожалеешь, что не знал раньше
↳ https://devsecrets.net/post/7-powerful-linq-methods/🔸 Исключения убивают приложения. Как с этим бороться
↳ https://devsecrets.net/post/throwing-exceptions-kills-apps/🔸 Как я выкатываю недоделанный код в прод (и почему тебе тоже стоит)
↳ https://devsecrets.net/post/how-i-push-unfinished-work-to-production/🔸 4 проверенных способа, как тесты выявляют ужасный код
↳ https://devsecrets.net/post/4-proven-ways-how-tests-reveal-awful-code/
Please open Telegram to view this post
VIEW IN TELEGRAM
😐7👍4❤2
Простой способ улучшить методы в C#
(с переменным числом параметров)
Используй улучшения ключевого слова
Ключевое слово
Раньше:
Теперь в C# 13 и .NET 9:
-
-
-
Это упрощает код и делает API гибче.
А ты уже используешь это улучшение?🤠
👉 @KodBlog
(с переменным числом параметров)
Используй улучшения ключевого слова
params
из .NET 9.Ключевое слово
params
в C# позволяет передавать переменное количество аргументов без необходимости перегрузки методов. Это удобно, когда количество входных параметров заранее неизвестно.Раньше:
params
работал только с массивами.Теперь в C# 13 и .NET 9:
params
можно использовать с любыми коллекциями, у которых есть метод Add
, включая:-
Span<T>
-
ReadOnlySpan<T>
-
IEnumerable<T>
Это упрощает код и делает API гибче.
А ты уже используешь это улучшение?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍13🔥3
90% C#‑проектов на старте не нуждаются в следующем:
🔸 Kubernetes
🔸 Микросервисах
🔸 Разделении БД на чтение/запись
В начале вам нужна простая и структурированная архитектура,
чтобы быстро двигаться и получать фидбэк от рынка и реальных пользователей.
Но при этом желательно предусмотреть базовый дизайн,
чтобы в будущем система могла эволюционировать.
Несколько месяцев назад я наткнулся на следующий репозиторий на GitHub:
Ссылка на репозиторий: https://github.com/evolutionary-architecture/evolutionary-architecture-by-example
Он показывает, как постепенно развивать архитектуру .NET‑приложения.
В нём выделено 4 этапа:
🔸 Начальная архитектура — фокус на простоте
🔸 Выделение модулей — фокус на поддерживаемости
🔸 Выделение микросервисов — фокус на масштабировании
🔸 Применение тактического DDD — фокус на сложности бизнес-домена
Архитектура начинается с малого,
но со временем развивается по мере роста требований.
Запомните:
👉 @KodBlog
В начале вам нужна простая и структурированная архитектура,
чтобы быстро двигаться и получать фидбэк от рынка и реальных пользователей.
Но при этом желательно предусмотреть базовый дизайн,
чтобы в будущем система могла эволюционировать.
Несколько месяцев назад я наткнулся на следующий репозиторий на GitHub:
"Evolutionary Architecture by Example"
Ссылка на репозиторий: https://github.com/evolutionary-architecture/evolutionary-architecture-by-example
Он показывает, как постепенно развивать архитектуру .NET‑приложения.
В нём выделено 4 этапа:
Архитектура начинается с малого,
но со временем развивается по мере роста требований.
Запомните:
Простота масштабируется. Сложность — ломается.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥5😁2🥴1
Использование Dapper
Я заметил, что есть отличные примеры для простых чтений, но практически нет примеров работы с более чем двумя JOIN'ами.
Это означает, что разработчику нужно хорошо разбираться как в SQL, так и в синтаксисе Dapper.
Пример:
👉 @KodBlog
Я заметил, что есть отличные примеры для простых чтений, но практически нет примеров работы с более чем двумя JOIN'ами.
Это означает, что разработчику нужно хорошо разбираться как в SQL, так и в синтаксисе Dapper.
Пример:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Пробовал ли ты функцию автоподсказок в встроенном терминале VS Code? Она даёт молниеносные автодополнения — например, динамические подсказки по веткам или навигации по путям.
Включается через настройку
👉 @KodBlog
Включается через настройку
"terminal.integrated.suggest.enabled"
(по умолчанию активна в версии Insiders)Please open Telegram to view this post
VIEW IN TELEGRAM
❤11
Одна команда сделала мою работу с GIT гораздо комфортнее.
Вот в чём суть:
Я работал над проектом в команде из 5+ разработчиков.
Каждый день было много коммитов — в основном, вполне нормальных.
Но в один момент кто-то (не я) запушил локальные настройки базы данных.
К счастью, это положило только дев-среду.
Решением было «удалить» этот коммит и откатить ветку к предыдущему стабильному состоянию.
И у GIT есть идеальная команда для этого —
С помощью этой команды можно откатиться к нужному коммиту и убрать все последующие
Как это работает:
🔸 Ты указываешь хеш коммита, который должен стать новым
🔸 GIT откатывает ветку до этого коммита и удаляет все коммиты после него
Эти «висящие» коммиты становятся осиротевшими (orphan commits).
У git reset есть три режима:
В своей практике я чаще всего использовал --
А какой у тебя опыт с этой командой?🙌
👉 @KodBlog
Вот в чём суть:
Я работал над проектом в команде из 5+ разработчиков.
Каждый день было много коммитов — в основном, вполне нормальных.
Но в один момент кто-то (не я) запушил локальные настройки базы данных.
К счастью, это положило только дев-среду.
Решением было «удалить» этот коммит и откатить ветку к предыдущему стабильному состоянию.
И у GIT есть идеальная команда для этого —
git reset
.С помощью этой команды можно откатиться к нужному коммиту и убрать все последующие
Как это работает:
HEAD
Эти «висящие» коммиты становятся осиротевшими (orphan commits).
У git reset есть три режима:
--soft
— изменения остаются в стейдже (index)--mixed
(по умолчанию) — изменения снимаются со стейджа, остаются в рабочей копии--hard
— изменения полностью откатываются (и из стейджа, и из рабочей директории)В своей практике я чаще всего использовал --
hard
, но в паре случаев пригодился и --soft
.А какой у тебя опыт с этой командой?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍2
Как правильно структурировать фичу в формате вертикального среза?
Вот простая структура вертикального среза, которую можно смело брать на вооружение:
🔸 Объект запроса/ответа
🔸 Определение эндпоинта
🔸 Бизнес-логика
Всё, что относится к одной фиче, находится в одном месте.
Почему это круто — объяснено здесь
Если ты до сих пор не используешь подход с вертикальными срезами, скорее всего, твое приложение концептуально сложнее, чем нужно.
👉 @KodBlog
Вот простая структура вертикального среза, которую можно смело брать на вооружение:
Всё, что относится к одной фиче, находится в одном месте.
Почему это круто — объяснено здесь
Если ты до сих пор не используешь подход с вертикальными срезами, скорее всего, твое приложение концептуально сложнее, чем нужно.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🤔5❤4
𝟵𝟬% разработчиков используют пагинацию на основе Offset
Потому что не знают, как реализовать пагинацию на основе Cursor.
Offset-based пагинация — один из самых простых и широко используемых способов постраничной загрузки данных.
Она работает по принципу: сначала пропускается заданное количество записей (offset), а затем выбирается фиксированное количество записей (page size).
Offset-подход использует два параметра:
-
-
Плюс: простота реализации
Минус: производительность сильно падает при больших offset-значениях, потому что БД вынуждена просканировать все строки до нужного места.
👉 Даже если используются индексы, базе всё равно приходится проходить через все строки.
Cursor-based пагинация (она же keyset или seek пагинация) — более эффективный метод для работы с большими объемами данных.
Вместо того чтобы "перепрыгивать" через записи, cursor-подход получает следующую порцию данных начиная с определённой позиции — курсорa.
Курсор обычно основывается на уникальном или отсортированном столбце (например,
Он представляет собой уникальное значение (или комбинацию значений), по которому можно однозначно определить позицию следующей страницы данных.
Но такой подход требует более сложной реализации.
Вот гайд с подробным разбором:
➡️ Пагинации на основе Offset
➡️ Пагинации на основе Cursor
➡️ Расширенных техник работы с курсорами по нескольким полям
➡️ Кодирования и декодирования курсоров
👉 @KodBlog
Потому что не знают, как реализовать пагинацию на основе Cursor.
Offset-based пагинация — один из самых простых и широко используемых способов постраничной загрузки данных.
Она работает по принципу: сначала пропускается заданное количество записей (offset), а затем выбирается фиксированное количество записей (page size).
Offset-подход использует два параметра:
-
offset
— количество записей, которые нужно пропустить-
limit
(или page size) — количество записей, которые нужно выбратьПлюс: простота реализации
Минус: производительность сильно падает при больших offset-значениях, потому что БД вынуждена просканировать все строки до нужного места.
Cursor-based пагинация (она же keyset или seek пагинация) — более эффективный метод для работы с большими объемами данных.
Вместо того чтобы "перепрыгивать" через записи, cursor-подход получает следующую порцию данных начиная с определённой позиции — курсорa.
Курсор обычно основывается на уникальном или отсортированном столбце (например,
id
или timestamp
).Он представляет собой уникальное значение (или комбинацию значений), по которому можно однозначно определить позицию следующей страницы данных.
Но такой подход требует более сложной реализации.
Вот гайд с подробным разбором:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥1
Как работать с представлениями в EF Core?
Вот краткий разбор:
Представления — это виртуальные таблицы, содержащие данные из одной или нескольких таблиц в SQL.
Отличие от физических таблиц в том, что сами данные они не хранят.
Можно воспринимать их как заранее определённые SQL-запросы для выборки данных.
А как EF Core с ними работает?
Почти так же, как и с обычными таблицами, но с небольшими отличиями.
В классе
И всё. Можно работать.🌟
👉 @KodBlog
Вот краткий разбор:
Представления — это виртуальные таблицы, содержащие данные из одной или нескольких таблиц в SQL.
Отличие от физических таблиц в том, что сами данные они не хранят.
Можно воспринимать их как заранее определённые SQL-запросы для выборки данных.
А как EF Core с ними работает?
Почти так же, как и с обычными таблицами, но с небольшими отличиями.
В классе
DbContext
нужно сконфигурировать тип, привязанный к view, как тип без ключа (HasNoKey()
), поскольку у представлений нет первичного ключа, и замапить его на соответствующее представление в базе.И всё. Можно работать.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤3
Оператор конкатенации ANSI SQL (
Он предлагает «более читаемую и соответствующую стандарту альтернативу существующим способам вроде
А ты как считаешь?🧀
👉 @KodBlog
||
) теперь поддерживается в базе данных Azure SQLОн предлагает «более читаемую и соответствующую стандарту альтернативу существующим способам вроде
+
и CONCAT()
».А ты как считаешь?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤3🤨2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2
Когда-нибудь нужно было открыть эндпоинт для внешней системы, но не хотелось поднимать полноценную систему аутентификации?
Аутентификация по API-ключу — простой и эффективный вариант.
В
Он встраивается в pipeline запроса и может быть внедрён через Dependency Injection
Хорошо подходит для:
- внутренних тулов
- вебхуков
- плановых задач
- интеграций с внешними сервисами
Ты сам определяешь:
- как передаётся ключ
- как он валидируется
- какие эндпоинты его требуют
Гайд с рабочим примером, который можно просто скопировать и адаптировать: здесь
👉 @KodBlog
Аутентификация по API-ключу — простой и эффективный вариант.
В
ASP.NET Core
для этого можно использовать IAuthorizationFilter
.Он встраивается в pipeline запроса и может быть внедрён через Dependency Injection
Хорошо подходит для:
- внутренних тулов
- вебхуков
- плановых задач
- интеграций с внешними сервисами
Ты сам определяешь:
- как передаётся ключ
- как он валидируется
- какие эндпоинты его требуют
Гайд с рабочим примером, который можно просто скопировать и адаптировать: здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍1
Большинство .NET разработчиков никогда с этим не сталкиваются.
Но это делает отладку в 10 раз проще.
Стандартный вид при отладке:
Никакого контекста. Много путаницы.
Но всего одной строкой кода?
Теперь окно наблюдения показывает:
В чём фишка?
Используйте
Добавляете этот атрибут в начало класса, чтобы контролировать, как будет отображаться информация о классе при отладке.
В следующий раз, когда будете смотреть на
👉 @KodBlog
Но это делает отладку в 10 раз проще.
Стандартный вид при отладке:
{Namespace.ObjectName}
Никакого контекста. Много путаницы.
Но всего одной строкой кода?
Теперь окно наблюдения показывает:
Order ORD-2025-001: Alice Smith - 249.99
Order ORD-2025-002: Bob Evans - 89.50
Order ORD-2025-003: Maria Lee - 1200.00
В чём фишка?
Используйте
DebuggerDisplay
.Добавляете этот атрибут в начало класса, чтобы контролировать, как будет отображаться информация о классе при отладке.
В следующий раз, когда будете смотреть на
{Namespace.ObjectName}
, помните: так не обязательно должно быть.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28❤5👍4🤔1🌚1
Новая библиотека для планирования задач, которая превосходит Quartz и Hangfire
3 недели назад вышла новая библиотека под названием TickerQ.
Что такое TickerQ?
TickerQ — высокопроизводительный планировщик, разработанный специально для .NET. Он фокусируется на простоте, масштабируемости и минимальном потреблении ресурсов.
Почему она лучше?
Традиционные библиотеки, такие как Quartz и Hangfire, имеют известные недостатки:
↳ Quartz:
• Сложный API, тяжело для новичков
• Отсутствие типобезопасности при передаче параметров в Job
• Потери в производительности из-за использования рефлексии
↳ Hangfire:
• Ограниченная поддержка DI и async-операций
• Простейшая логика повторных попыток (retry)
• Потери в производительности из-за использования рефлексии
Как TickerQ решает эти проблемы:
1️⃣ Легковесный и интуитивно понятный API
2️⃣ Без рефлексии, использует source generators
3️⃣ Нативная поддержка распределённого планирования без дополнительной сложности
4️⃣ Встроенная логика повторных попыток и упрощённая обработка ошибок
Quartz и Hangfire долгое время были стандартом, но теперь есть лучший вариант.
Что думаете про эту новую библиотеку для планирования? Попробуете TickerQ или останетесь на Quartz или Hangfire?
👉 @KodBlog
3 недели назад вышла новая библиотека под названием TickerQ.
Что такое TickerQ?
TickerQ — высокопроизводительный планировщик, разработанный специально для .NET. Он фокусируется на простоте, масштабируемости и минимальном потреблении ресурсов.
Почему она лучше?
Традиционные библиотеки, такие как Quartz и Hangfire, имеют известные недостатки:
↳ Quartz:
• Сложный API, тяжело для новичков
• Отсутствие типобезопасности при передаче параметров в Job
• Потери в производительности из-за использования рефлексии
↳ Hangfire:
• Ограниченная поддержка DI и async-операций
• Простейшая логика повторных попыток (retry)
• Потери в производительности из-за использования рефлексии
Как TickerQ решает эти проблемы:
Quartz и Hangfire долгое время были стандартом, но теперь есть лучший вариант.
Что думаете про эту новую библиотеку для планирования? Попробуете TickerQ или останетесь на Quartz или Hangfire?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤5