2016-05-18 9 views
0

処理に時間がかかります。私はコード&を分析して、時間のかかるコードの部分を探しました。Linqの処理に長時間かかっています

私のlistTempInOutには、100000を超えるレコードがあります。 SDetailsにはさらにレコードがあります。私はupdateの2つのフィールドをモデルに入れたかったのです。したがって、次のコードである: -

var dataUpd = (from A in tempSS 
           from B in SDetails 
           from C in listTempInOut 
           where A.Id == B.Id 
           && A.Shift == B.Shift && A.Employee == C.Employee && A.SDate == C.Time_Date1 
           select new { A.SId, B.Status, C }).ToList(); 
       foreach (var row in dataUpd) 
       { 
        row.C.Time_Field1 = row.ShiftId; 
        row.C.Time_Field2 = row.Status.ToString(); 
       } 

それがコードを実行するのにかかる時間を短縮するようimprove the performanceに上記のコードではどのようなchange can i do

+0

「1 lac records」? – Slugart

+0

@Slugart:1 lacは測定/カウントユニットです - > [wiki](https://en.wikipedia.org/wiki/Lakh)、確かにSIは帝国ではありません:) – quetzalcoatl

+0

あなたのテーブル構造がそれを可能にするならば結合してください – Chris

答えて

0

エンティティフレームワークの更新が非常に遅い場合は、AutoDetectChangesEnabledプロパティをコンテキスト内でfalseに設定してみてください(以下のコードを参照してください。コンテキストが実際に呼び出されるため、「myContext」と呼ばれます)。更新が完了したらtrueに戻すように設定する必要がありますので、try/finallyブロックでコードをラップすることをお勧めします。

 try 
     { 
      myContext.Configuration.AutoDetectChangesEnabled = false; 
      var dataUpd = (from A in tempSS 
          from B in SDetails 
          from C in listTempInOut 
          where A.Id == B.Id 
          && A.Shift == B.Shift && A.Employee == C.Employee && A.SDate == C.Time_Date1 
          select new { A.SId, B.Status, C }).ToList(); 
      foreach (var row in dataUpd) 
      { 
       row.C.Time_Field1 = row.ShiftId; 
       row.C.Time_Field2 = row.Status.ToString(); 
      } 
     } 
     finally 
     { 
      myContext.Configuration.AutoDetectChangesEnabled = true; 
     } 
+0

OPは、ToListが原因だと言いました。 –

+0

.ToListはクエリを列挙し、データベースからデータを取得しますが、これはforeachループでコレクションを反復しようとするとすぐに発生します。それは "toList"呼び出しを削除する害はないが、私は重大なパフォーマンスの改善が観察されることを疑う。あなたはいつも両方を試して、彼らがどれほどうまくいくか見ることができます。 –

+0

'tempSS'と' SDetails'がデータベース呼び出しを表しているかどうかわかりません。 OPは十分な情報を与えていない。 –

関連する問題