Оптимизация суммы заказа в LINQ и Entity Framework - PullRequest
0 голосов
/ 29 мая 2018

Я написал запрос LINQ, который выполняет orderby в контексте базы данных Entity Framework Core (.NET Core 2.0.7), используя метод расширения Sum.Он отлично работает на небольшой выборочной базе данных, но при работе с более крупной базой данных ~ 100 000 записей он становится значительно медленнее и использует больше ресурсов ЦП.Я вставил соответствующий код ниже.Есть ли способ выполнить Sum быстрее?(по сути, это средневзвешенное значение для произвольного числа кортежей).

var iqClientIds = (from stat in context.Set<EFClientStatistics>()
    join client in context.Clients
    on stat.ClientId equals client.ClientId
    group stat by stat.ClientId into s
    orderby s.Sum(cs => (cs.Performance * cs.TimePlayed)) / s.Sum(cs => cs.TimePlayed) descending
    select new
    {
          s.First().ClientId,
    })
    .Skip(start)
    .Take(count);

Спасибо!

1 Ответ

0 голосов
/ 30 мая 2018

EF Core 2 обрабатывает GroupJoin с переводом на SQL, и ваш запрос может быть преобразован для использования этого:

var iqClientIds = (from client in context.Clients 
                   join stat in context.Set<EFClientStatistics>() on client.ClientId equals stat.ClientId into sj
                   orderby sj.Sum(s => (s.Performance * s.TimePlayed)) / sj.Sum(s => s.TimePlayed) descending
                   select sj.First().ClientId
                  )
                  .Skip(start)
                  .Take(count);

ПРИМЕЧАНИЕ. Я упростил результат (select), чтобы не создавать анонимный объектдля одного значения.

...