LINQ和实体框架中orderby sum的优化
我编写了一个LINQ查询,它使用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
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);