GroupBy执行缓慢

时间:2017-11-16 14:09:03

标签: c#

我有以下查询,对于3000条记录而言超级慢,并产生370个条目。我怎样才能提高它的性能?

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();

2 个答案:

答案 0 :(得分:0)

我认为linkedLeadCores.Count()是这里的瓶颈,因为每次处理linkedLeadCores条目时,您都会遍历整个_results列表。您的意见似乎也证实了这一假设。

因此,为了消除瓶颈,你可以创建一个地图(也就是字典)来保存每个经销商的计数,然后再对_results进行任何操作......

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,

答案 1 :(得分:0)

linkedLeadCores执行Group Join将使用内部哈希表进行查找,并应解决您的问题。

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();