Предложения по производительности:
- Запрет отслеживания. Запрос в режиме только для чтения.
- Не допускайте получения слишком большого количества данных в одном запросе. Попробуйте на странице.
- Предотвратить включение. В запросе слишком много
Include
с, что ухудшает производительность.
Запретить отслеживание
Попробуйте добавить AsNoTracking
, чтобы повысить производительность запроса.
Ссылка : https://docs.microsoft.com/en-us/ef/core/querying/tracking#no -tracking-query
Получите только те данные, которые вам нужны
И основная причина медленного запроса - вывод слишком большого количества данных. Попробуйте добавить: Take(200)
, Skip()
, чтобы получить только те данные, которые вам нужны или требуются текущей странице. Используйте пейджер для генерации отчета. Это может очень помочь.
Запрет Include
Include
создает SQL для выбора нескольких таблиц. Что значительно увеличило сложность. Вы можете выбрать только те данные, которые вам нужны, и запретить написание функции Include
.
Например, если вы хотите получить только последний шарик в коробке, рассмотрите возможность записи так:
public class Box
{
public int Id { get; set; }
public IEnumerable<Ball> Balls { get; set; }
}
public class Ball
{
public int Id { get; set; }
public int BoxId { get; set; }
public Box Box { get; set; }
}
var boxes = await Boxes
// DO NOT Call Include(t => t.Balls) here!
.Where(somecondition)
.Select(t => new Box(){
Id = t.Id,
Balls = t.Balls.OrderByDescending(x => x.CreationTime)
.Take(1) // Only get what you need
})
.ToListAsync()
Также, когда мы используем Select, мы можем удалить .Include
, потому что это не будет иметь никакого эффекта.