Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ和实体框架中orderby sum的优化_Linq_.net Core_Entity Framework Core - Fatal编程技术网

LINQ和实体框架中orderby sum的优化

LINQ和实体框架中orderby sum的优化,linq,.net-core,entity-framework-core,Linq,.net Core,Entity Framework Core,我编写了一个LINQ查询,它使用Sum扩展方法在实体框架核心(.netcore2.0.7)数据库上下文上执行orderby。它在一个小样本数据库上运行良好,但在一个较大的数据库(100000个条目)上运行时,速度会明显变慢,并使用更多的CPU。我已将相关代码粘贴到下面。有没有办法更快地执行求和?(它本质上是任意数量元组的加权平均值) var iqClientIds=(来自context.Set()中的stat) 在上下文中加入客户端。客户端 on stat.ClientId等于client.Cl

我编写了一个LINQ查询,它使用
Sum
扩展方法在实体框架核心(.netcore2.0.7)数据库上下文上执行
orderby
。它在一个小样本数据库上运行良好,但在一个较大的数据库(100000个条目)上运行时,速度会明显变慢,并使用更多的CPU。我已将相关代码粘贴到下面。有没有办法更快地执行
求和
?(它本质上是任意数量元组的加权平均值)

var iqClientIds=(来自context.Set()中的stat)
在上下文中加入客户端。客户端
on stat.ClientId等于client.ClientId
按stat.ClientId将stat分组为s
orderby s.Sum(cs=>(cs.Performance*cs.TimePlayed))/s.Sum(cs=>cs.TimePlayed)递减
选择新的
{
s、 First().ClientId,
})
.跳过(开始)
.记(数);

谢谢

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);
var IQClientId=(来自context.Clients中的客户端
将client.ClientId上的context.Set()中的stat连接到sj中等于stat.ClientId
orderby sj.Sum(s=>s.Performance*s.TimePlayed))/sj.Sum(s=>s.TimePlayed)降序
选择sj.First().ClientId
)
.跳过(开始)
.记(数);

注意:我简化了结果(
select
)以不为单个值创建匿名对象。

您能否尝试使用EF Core 2.1(),因为<2.1不将GroupBy转换为SQL,导致它在.net Core应用程序的内存中进行计算感谢您的建议@martin ullrich。但是,2.1版似乎没有完整的MySQL提供程序。MySQL.Data和Pomelo.EntityFramework.MySQL都无法正常工作。请注意,如果在查询的
orderby
/
select
部分中有许多其他字段未使用,那么对查询进行早期选择可以通过减少
组拉入的数据量来提高性能(例如,
groupnew{stat.ClientId,stat.Performance,stat.TimePlayed}by
)。使用您建议的变体,我能够提高性能。我只需等待一个2.1兼容的MySQL提供程序,直到我再次使用GROUPBY。谢谢!
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);