Entity Framework Lazy Loading Sum Дочерняя таблица Slow - PullRequest
0 голосов
/ 10 марта 2019

У меня проблемы с производительностью при использовании метода сумм в структуре сущностей.Чтобы объяснить это лучше, это моя структура таблицы:

+----+--------+---------+-------+   +-----------+-----------+-------+
| Id |  Name  | Company | Color |   | ArticleId | Purchaser | Price |
+----+--------+---------+-------+   +-----------+-----------+-------+
|  1 | iPhone | Apple   | Black |   |         1 | Bob       |   350 |
|  2 | iPad   | Apple   | Grey  |   |         1 | Mat       |   220 |
+----+--------+---------+-------+   |         2 | Ivy       |   450 |
                                    +-----------+-----------+-------+

Это связанная модель для таблицы Article:

public int Id { get; set; }
public string Name { get; set; }
...
[NotMapped]
public decimal? TotalAmount { get; set; }
public virtual ICollection<Purchase> PurchaserList { get; set; }

Используя ленивую загрузку, Entity Framework будет автоматическизагрузить всех связанных покупателей.Затем я просто суммирую цену для каждой статьи и устанавливаю ее равной свойству TotalAmount:

articleList = dbContext.Article.Where(x => x.CompanyId == 10).ToList();

foreach(var article in articleListe)
    article.TotalAmount= article.PurchaserList.Sum(x => x.Price);

Однако для таблицы с 100 записями это занимает около 4 секунд.Конечно, это слишком медленно, и мне нужно немного его ускорить.У кого-нибудь есть какие-либо предложения или что-нибудь, что я могу улучшить, чтобы сделать это быстрее?

Редактировать:

Как уже упоминалось в rad, изменить его с ленивой загрузки на страстнуюзагрузка улучшила время загрузки с 4 секунд до 0,17 секунд.Я удалил виртуальную клавиатуру и изменил свой код следующим образом:

articleList = dbContext.Article.Where(x => x.CompanyId == 10).Include(x => x.PurchaserList).ToList();

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Используйте энергичную загрузку (Include) вместо отложенной загрузки.
Ленивая загрузка не является хорошим выбором в вашем сценарии, потому что для каждого PurchaserList, который нужно получить, устанавливается новое соединение с базой данных (т.е. 100соединения в вашем примере), и это - ввод-вывод базы данных, который требует времени.
Вы можете отслеживать запросы и соединения, используя Sql Profiler.

0 голосов
/ 10 марта 2019

Вы должны попробовать это, чтобы получить свою сумму напрямую из БД, используя прогнозы:

articleListSum = dbContext.Article.Where(x => x.CompanyId == 10).Select(x => x.PurchaserList.Select(y => y.Price)).DefaultIfEmpty(0).Sum();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...