Что даёт AsNoTracking в запросе только на чтение
Эндпоинт GET /api/orders возвращает список из нескольких тысяч заказов. На код-ревью просят добавить в запрос AsNoTracking().
var orders = await db.Orders
.Where(o => o.CreatedAt >= from)
.AsNoTracking()
.ToListAsync();
Что именно даёт этот вызов?
- Сущности не попадают в трекер изменений: экономятся память и время, но SaveChanges не увидит правки таких объектов
- Запрос выполняется в режиме read-only на стороне базы и берёт более слабую блокировку строк
- Результат кэшируется и переиспользуется между HTTP-запросами
- Отключается ленивая загрузка навигационных свойств, чтобы случайно не получить лишние запросы к базе при обходе коллекций
