Несколько запросов вместо одного в EF Core - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть этот выбор, который я ожидал выполнить, отправив одну команду на SQL Server, но вместо этого я вижу запросы 10 с.Как я могу это исправить?

У нас есть компании, у которых есть клиенты и заказы.По некоторым причинам Заказы находятся под юридическим лицом Компании.

var q = _dbContext.Companies
        .Include(x => x.Customers)
        .Include(c => c.Orders)
        .Where(a => a.CompanyId == 123);

 var total = await q.CountAsync();

 q = q.OrderByDescending(x => x.CompanyCode)
     .Skip((pageIndex - 1) * pageSize).Take(pageSize);

 var res = await q.Select(x => new ResultDto()
 {
     CompanyCode = x.CompanyCode,     
     Customers = x.Customers
         .Where(c => c.IsActive)
         .Select(c => new CustomerDto()
         {
             FirstName = c.FirstName,
             Surname = c.Surname,             
             Orders = x.Orders
                 .Where(o => o.IsOpen)
                 .Select(o => new OrderDto()
                 {
                     DateCreated = o.DateCreated
                 }).ToList()
         }).FirstOrDefault(),
 }).ToListAsync();

1 Ответ

0 голосов
/ 26 февраля 2019

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

Как только у вас есть коллекция в ваших переходах внутри select или внутри включает, она создаст отдельный запрос для каждой корневой сущности.Я полагаю, что причиной является избыточный объем данных, создаваемый таким запросом.

Я предлагаю оставить все как есть, если у вас не много данных <1000 строк в результате.Вы увидите много запросов, но они будут очень быстрыми.</p>

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

В противном случае, выбирайте свои коллекции отдельно и тщательно объединяйте их в памяти.

К сожалению,у EF Core нет другого пути

Кроме того, я рекомендую включить журналы ядра EF так, как это происходит раньше.Бьюсь об заклад, FirstOrDefault выдаст предупреждение.

...