C# GroupBy的表现很慢
我有下面的查询,3000条记录的速度非常慢,生成370条条目。如何提高it性能C# GroupBy的表现很慢,c#,C#,我有下面的查询,3000条记录的速度非常慢,生成370条条目。如何提高it性能 dealerResults = _results.GroupBy(x => new { x.DealerName, x.DealerId }) .Select(x => new MarketingReportResults() {
dealerResults = _results.GroupBy(x => new { x.DealerName, x.DealerId })
.Select(x => new MarketingReportResults()
{
DealerId = x.Key.DealerId,
DealerName = x.Key.DealerName,
LinkedTotal = linkedLeadCores.Count(y => y.DealerId == x.Key.DealerId),
LeadsTotal = x.Count(),
SalesTotal = x.Count(y => y.IsSold),
Percent = (decimal)(x.Count() * 100) / count,
ActiveTotal = x.Count(y => y.IsActive),
}).ToList();
我认为
linkedLeadCores.Count()
是这里的瓶颈,因为每次处理\u结果
条目时,都会循环遍历整个linkedLeadCores
列表。你的评论似乎也证实了这一假设
因此,为了消除瓶颈,您可以创建一个地图(又名字典),在对\u结果执行任何操作之前保存每个经销商的计数,如下图所示
var linkedLeadCoresCountMap = linkedLeadCores
.GroupBy(y => y.DealerId )
.ToDictionary(y => y.Key, y => y.Count());
。。。然后你就可以写了
LinkedTotal = linkedLeadCoresCountMap.ContainsKey(x.Key.DealerId) ?
linkedLeadCoresCountMap[x.Key.DealerId] : 0,
执行tolinkedLeadCores
将使用内部哈希表进行查找,应该可以解决您的问题
var dealerResults =
(from r in _results.GroupBy(x => new { x.DealerName, x.DealerId })
join llc in linkedLeadCores on r.Key.DealerId equals llc.DealerId into g
select new MarketingReportResults()
{
DealerId = r.Key.DealerId,
DealerName = r.Key.DealerName,
LinkedTotal = g.Count(),
LeadsTotal = r.Count(),
SalesTotal = r.Count(y => y.IsSold),
Percent = (decimal)(r.Count() * 100) / count,
ActiveTotal = r.Count(y => y.IsActive),
}).ToList();
linkedLeadCores
有多大?它是IQueryable
还是IEnumerable
?什么是\u结果
,是另一个查询吗?linkedLeadCores
是一个集合还是一个数据库表?如果它是一个表,那么DealerId
上是否有索引?太多东西不清楚了。数据在数据库中吗?如果是这样,将查询卸载到Db服务器。无法将为数据操作而优化的某个组件的性能与其他组件(linq)的性能进行比较,linq被设计为操作内存中小型数据集的子实用程序(即内部查询优化几乎为零),可能会删除分组,并查看这是否会导致性能降低,可能会看到SQL查询-并使用SQL Server探查器检测瓶颈。。。等等。很多方面,很多原因都是可能的——例如,如果你将Azure SQL与定价层Basic一起使用,它肯定不会很快。谢谢你,这让过程变得即时。谢谢你们