C# Portal | Программирование – Telegram
C# Portal | Программирование
14.9K subscribers
966 photos
118 videos
24 files
809 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Связь: @devmangx

РКН: https://clck.ru/3FocB6
Download Telegram
𝟭𝟬 шагов для оптимизации запросов в EF Core

Даже сеньоры знают не все из них

Допустим, у тебя в проде тормозит EF Core-запрос.

Как бы ты исследовал и починил проблему?

Вот пошаговый подход: ( смотри иллюстрации )

А вот как начать работу с OpenTelemetry:
ссылка

Как Антон оптимизировал реальный запрос EF Core Query с 30 секунд до 30 миллисекунд:
ссылка

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍3
Я ждал эту фичу 4 года и вот наконец она появляется в EF Core 10

EF Core 10 приносит серьёзное улучшение в метод
ExecuteUpdateAsync

Раньше
, чтобы сделать динамическое обновление, нужно было вручную собирать сложные и склонные к ошибкам expression tree'и.

Например: ты хочешь обновить поле Views у блога и, при определённом условии, ещё и Name.
Раньше это значило писать довольно громоздкую логику вручную через expression API.

Теперь — всё стало намного проще:
↳ можно просто использовать обычную лямбду, внутри которой разрешены if и другие управляющие конструкции.

это улучшение делает код гораздо читаемее, поддерживаемее и снижает риск багов, связанных с ручной генерацией выражений.

Ждёшь эту фичу так же, как и я?
Дай знать, что думаешь 👍

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥252
Если ты используешь GUID'ы в C# коде, тебе наверняка понравится нововведение в .NET 9: GUID версии 7.

GUID — глобально уникальный идентификатор) гарантирует уникальность значений между разными источниками.

В предыдущих версиях C# новые записи вставлялись в случайные позиции, что приводило к фрагментации индексов.

В .NET 9 появилась поддержка GUID версии 7, которые создаются последовательно.

Благодаря этому GUID теперь лучше подходят для использования в реляционных базах данных.

Кроме того, при генерации нового GUID теперь можно передать DateTimeOffset, чтобы задать собственное значение временной метки.

Ты уже начал использовать GUID версии 7? 😏

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍208
Чувствуешь, что отстаёшь в .NET?

Вот 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/


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
😐7👍42
Простой способ улучшить методы в C#
(с переменным числом параметров)

Используй улучшения ключевого слова params из .NET 9.

Ключевое слово params в C# позволяет передавать переменное количество аргументов без необходимости перегрузки методов. Это удобно, когда количество входных параметров заранее неизвестно.

Раньше:
params работал только с массивами.

Теперь в C# 13 и .NET 9:
params можно использовать с любыми коллекциями, у которых есть метод Add, включая:

- Span<T>
- ReadOnlySpan<T>
- IEnumerable<T>

Это упрощает код и делает API гибче.

А ты уже используешь это улучшение?🤠

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍13🔥3
90% C#‑проектов на старте не нуждаются в следующем:

🔸Kubernetes
🔸Микросервисах
🔸Разделении БД на чтение/запись

В начале вам нужна простая и структурированная архитектура,
чтобы быстро двигаться и получать фидбэк от рынка и реальных пользователей.

Но при этом желательно предусмотреть базовый дизайн,
чтобы в будущем система могла эволюционировать.

Несколько месяцев назад я наткнулся на следующий репозиторий на GitHub:
"Evolutionary Architecture by Example"


Ссылка на репозиторий: https://github.com/evolutionary-architecture/evolutionary-architecture-by-example

Он показывает, как постепенно развивать архитектуру .NET‑приложения.

В нём выделено 4 этапа:

🔸Начальная архитектура — фокус на простоте
🔸Выделение модулей — фокус на поддерживаемости
🔸Выделение микросервисов — фокус на масштабировании
🔸Применение тактического DDD — фокус на сложности бизнес-домена

Архитектура начинается с малого,
но со временем развивается по мере роста требований.

Запомните:
Простота масштабируется. Сложность — ломается.


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥5😁2🥴1
Использование Dapper

Я заметил, что есть отличные примеры для простых чтений, но практически нет примеров работы с более чем двумя JOIN'ами.

Это означает, что разработчику нужно хорошо разбираться как в SQL, так и в синтаксисе Dapper.

Пример:

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63
This media is not supported in your browser
VIEW IN TELEGRAM
Пробовал ли ты функцию автоподсказок в встроенном терминале VS Code? Она даёт молниеносные автодополнения — например, динамические подсказки по веткам или навигации по путям.

Включается через настройку "terminal.integrated.suggest.enabled" (по умолчанию активна в версии Insiders)

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
13
Одна команда сделала мою работу с GIT гораздо комфортнее.

Вот в чём суть:

Я работал над проектом в команде из 5+ разработчиков.
Каждый день было много коммитов — в основном, вполне нормальных.

Но в один момент кто-то (не я) запушил локальные настройки базы данных.
К счастью, это положило только дев-среду.

Решением было «удалить» этот коммит и откатить ветку к предыдущему стабильному состоянию.

И у GIT есть идеальная команда для этого — git reset.

С помощью этой команды можно откатиться к нужному коммиту и убрать все последующие

Как это работает:

🔸Ты указываешь хеш коммита, который должен стать новым HEAD
🔸GIT откатывает ветку до этого коммита и удаляет все коммиты после него

Эти «висящие» коммиты становятся осиротевшими (orphan commits).

У git reset есть три режима:

--soft — изменения остаются в стейдже (index)
--mixed (по умолчанию) — изменения снимаются со стейджа, остаются в рабочей копии
--hard — изменения полностью откатываются (и из стейджа, и из рабочей директории)

В своей практике я чаще всего использовал --hard, но в паре случаев пригодился и --soft.

А какой у тебя опыт с этой командой? 🙌

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍2
Как правильно структурировать фичу в формате вертикального среза?

Вот простая структура вертикального среза, которую можно смело брать на вооружение:

🔸Объект запроса/ответа
🔸Определение эндпоинта
🔸Бизнес-логика

Всё, что относится к одной фиче, находится в одном месте.

Почему это круто — объяснено здесь

Если ты до сих пор не используешь подход с вертикальными срезами, скорее всего, твое приложение концептуально сложнее, чем нужно.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🤔54
𝟵𝟬% разработчиков используют пагинацию на основе Offset

Потому что не знают, как реализовать пагинацию на основе Cursor.

Offset-based пагинация — один из самых простых и широко используемых способов постраничной загрузки данных.
Она работает по принципу: сначала пропускается заданное количество записей (offset), а затем выбирается фиксированное количество записей (page size).

Offset-подход использует два параметра:

- offset — количество записей, которые нужно пропустить
- limit (или page size) — количество записей, которые нужно выбрать

Плюс: простота реализации
Минус: производительность сильно падает при больших offset-значениях, потому что БД вынуждена просканировать все строки до нужного места.

👉 Даже если используются индексы, базе всё равно приходится проходить через все строки.

Cursor-based пагинация (она же keyset или seek пагинация) — более эффективный метод для работы с большими объемами данных.

Вместо того чтобы "перепрыгивать" через записи, cursor-подход получает следующую порцию данных начиная с определённой позиции — курсорa.

Курсор обычно основывается на уникальном или отсортированном столбце (например, id или timestamp).

Он представляет собой уникальное значение (или комбинацию значений), по которому можно однозначно определить позицию следующей страницы данных.

Но такой подход требует более сложной реализации.

Вот гайд с подробным разбором:

➡️Пагинации на основе Offset
➡️Пагинации на основе Cursor
➡️Расширенных техник работы с курсорами по нескольким полям
➡️Кодирования и декодирования курсоров

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥1
Вот настройка OpenTelemetry для трассировки и логирования в .NET:

Если хочешь узнать больше, то вот гайд как экспортировать телеметрию в Grafana 👍

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
9
Как работать с представлениями в EF Core?

Вот краткий разбор:

Представления — это виртуальные таблицы, содержащие данные из одной или нескольких таблиц в SQL.

Отличие от физических таблиц в том, что сами данные они не хранят.

Можно воспринимать их как заранее определённые SQL-запросы для выборки данных.

А как EF Core с ними работает?

Почти так же, как и с обычными таблицами, но с небольшими отличиями.

В классе DbContext нужно сконфигурировать тип, привязанный к view, как тип без ключа (HasNoKey()), поскольку у представлений нет первичного ключа, и замапить его на соответствующее представление в базе.

И всё. Можно работать. 🌟

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥4