2017-05-31 7 views
-1

私は約65,000レコードのデータでグループ化するのに約1分かかるLINQクエリがあります。さらに最適化して時間を短縮する方法はありますか?パフォーマンスの最適化によるコレクションコレクション

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

これは、あなたが 'groupedDocs = g'を求めているので、これがあなたのORMにグループキーのための1つのクエリを作成させ、グループごとの* 1つのクエリ(N + 1問題としても知られる) 。とにかくすべての行をロードしているので、必要なフィールド(グループに入っているフィールド)と 'TranAmount'と' USDTranAmount'フィールドを選択し、メモリ内でグループ化するほうがパフォーマンスが良いかもしれません。 – Rob

+0

あなたは、どの時点で多くの時間がかかったのかを知る必要があります。 APIまたはLINQを呼び出します。 まず、LINQなしですべてのデータをAPIから取得しましょう。 – hiule

答えて

0

これは、すべてのメモリで実行されている、我々はAggregateに一度のコールにSumには、2つの呼び出しを最適化するが、私はそれがより速くなるでしょう。わからない試みることができると仮定すると:

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

関連する問題