C# GroupBy的表现很慢

C# GroupBy的表现很慢,c#,C#,我有下面的查询,3000条记录的速度非常慢,生成370条条目。如何提高it性能 dealerResults = _results.GroupBy(x => new { x.DealerName, x.DealerId }) .Select(x => new MarketingReportResults() {

我有下面的查询,3000条记录的速度非常慢,生成370条条目。如何提高it性能

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,
执行to
linkedLeadCores
将使用内部哈希表进行查找,应该可以解决您的问题

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一起使用,它肯定不会很快。谢谢你,这让过程变得即时。谢谢你们