Это проблема n плюс 1? Несколько вызовов DbContext в одном запросе - PullRequest
0 голосов
/ 07 ноября 2019

Я не уверен, что полностью понимаю проблему n + 1. Относится ли этот случай также к проблеме n + 1?

Использование EF Core: например, есть 10000 членов и 1000000 транзакций.

public class ReportService
{
      ...
      public IEnumerbale<ReportItem> GetResult()
      {
           var reportItems = new List<ReportItem>();
           var members = _context.Users.Where(x => x.IsMember);

           foreach(var member in members)
           {
               var calculationResult = _calculationService.Calculate(member.Id);
               reportItems.Add(calculationResult); 
           }

           return reportItems;
      }
}

public class CalculationService
{
      ...
      public CalculationResult Calculate(int memberId)
      {
           var memberTransactions = _context.Transactions.Where(x => x.UserId == memberId);

           var result = new CalculationResult(memberTransactions.Sum(x => x.Amount));

           return result;
      }
}

Должен ли я взять на себя ответственность за получение данных отCalculationService (чтобы избежать многих запросов)? Каков наилучший способ избежать подобных ситуаций?

1 Ответ

0 голосов
/ 07 ноября 2019

Поиск пользователей, а затем создание предисловия к поиску каждого пользователя. Данные транзакций потребуют много усилий и могут убить вашу производительность.
Этот тип кода сделает ваш API довольно медленным и может привести к исключениям времени ожидания. лучший способ - объединить обе таблицы и просто получить результат из объединенного списка. Примерно так будет лучше.

context.Users.Join(
contex.Transactions, 
x => x.MemberId, 
xm => xm.MemberId
(x,xm) => new {Users = x, Transactions = xm }
).Select(p => p.Transactions.Amount).Sum()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...