Я написал запрос 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);

Благодарность!

2
RaidMax 29 Май 2018 в 06:39

1 ответ

Лучший ответ

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), чтобы не создавать анонимный объект для одного значения.

0
NetMage 29 Май 2018 в 21:26