2017-05-31 48 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