2017-05-31 26 views
-1

我有以下的LINQ查询,这需要大约65,000条记录我的数据分组。有没有什么办法可以进一步优化以缩短时间。通过性能优化的C#集合组

var grouped = (from T1 in dataCollection.trancollection 
group T1 by new { T1.Name, T1.ExternalID, T1.AccountNumber, T1.Code, T1.Location, T1.Date, T1.CurrencyCode, T1.StatusName } into g 
select new 
{ 
    Id = g.Key, 
    groupedDocs = g, 
    Amount = g.Sum(x => x.TranAmount), 
    USDAmt = g.Sum(x => x.USDTranAmount)                 
}).ToList(); 

该集合的数据通过另一个API调用提供。有没有其他方法来提高性能?而我的收藏类型是IReadOnlyCollection <>

非常感谢您的帮助!

+0

可以您可以通过更少的特性,也许组只是'ExternalID'? – Slai

+1

我相当肯定这会导致你的ORM为组密钥做一个查询,然后*每个组*一个查询*(也称为N + 1问题),因为你要求'groupedDocs = g' 。由于无论如何都要加载所有行,因此只需选择需要的字段(进入组)并加上'TranAmount'和'USDTranAmount',然后在内存中进行分组,就可以更高效。 – Rob

+0

你需要找出哪一点花了很多时间。调用API或LINQ。 因此,我们先从没有LINQ的API获取所有数据。 – hiule

回答

0

假设这是全部运行在内存中,我们可以尝试两次调用Sum优化到一个呼叫Aggregate,但我不知道那会更快:

var grouped = (from T1 in dataCollection.trancollection 
       group T1 by new { T1.Name, T1.ExternalID, T1.AccountNumber, T1.Code, T1.Location, T1.Date, T1.CurrencyCode, T1.StatusName } into g 
       let sumPair = g.Aggregate(new { SumAmount = 0.0, SumUSD = 0.0 }, (sump, x) => new { SumAmount = sump.SumAmount + x.TranAmount, USDAmt = sump.USDAmount + x.USDTranAmount }) 
       select new { 
        Id = g.Key, 
        groupedDocs = g, 
        Amount = sumPair.SumAmount, 
        USDAmt = sumPair.SumUSD 
       }).ToList(); 
+1

假设这只是在内存中运行,只有65,000条记录,这应该只需要几毫秒。 – Enigmativity