2017-03-08 14 views
0

Entity Frameworkを初めて使用しているので、これが問題ではないことを願っています。
基本的に私はそれに30000と100000のレコードを持つ大きながあります。基本的に、各レコードの興味深いフィールドは、アプリケーション側で計算されなければならないIDと合計です。 Entity Framework 6大規模なテーブル一括更新

私はレコードを取得して、さまざまな計算を実行してそのクラスに新しい合計を割り当てるビジネスロジッククラスにそれらを投影します。

var validPriceVersionID = context.PriceVersion.Where(f => f.Status == "VALID").FirstOrDefault().PriceVersionID; 
       var tmp = context.EndItem.Where(f => f.Total == 0).Project().To<EndItem>().ToList(); 
       tmp.Select(c => { c.PriceVersionID = validPriceVersionID; return c; }).ToList(); 
ここで、IDに基づいてSQLテーブル全体を新しいTotalで更新する必要があります。ここで私の悪夢が始まります。例えば、以下のような基本的なようなものは、時間

var idTotalPair = tmp.Select(x => new {x.EndItemID, x.Total}).ToArray(); 

の異常な量を取っている私はいくつか・研究を行い、EFは、バルクopperationsをサポートし、それがストアドプロシージャのTableTypedパラメータをサポートしていないことをしないことが分かってきました。

私が推したことは、各合計計算後にすべてのレコードを更新するための最良の(実行可能な)方法を見つけることです。すべてのヘルプはgreatelly理解されるであろう:)事前

+1

この[リンク](http://entityframework-extensions.net/?z=codeplex)( – Anton

+1

が簡単になります何かのように見える便利にすることができ、はるかに速い)良い古いストアドプロシージャで解決 – jeroenh

答えて

0

にあなたは生のコマンドを使用することができます

感謝を。次のようなものがあります。

using (var context = new MyContext()) 
    { 
     context.Database.ExecuteSqlCommand( 
      "UPDATE EndItem SET Total = ... WHERE EndItemId = ..."); 
    } 
+0

SQLインジェクションのために良い考えではないかもしれません。 – Catwood

+0

合計とIDが私たちによって計算されているためSQLインジェクション可能ではありません) –

+0

これはおそらく真実かもしれませんが、アプリケーションが進化するにつれて、誰がこれらの値がどこから来るのかを知っています。ステートメントがパラメータ化されている場合、これはこれに対して防御します。 – Catwood

0

最も効率的な方法は@jeroenhのコメントです。可能であれば、ストアドプロシージャ内のすべてを作成する。

免責事項

  • バルクのSaveChanges
  • :私はこのライブラリは無料ではありませんが、あなたがこのようなシナリオのための一括更新やその他の操作を実行することができます Entity Framework Extensions

    の持ち主です

  • バルク挿入
  • バルク削除
  • バルク更新
  • 一括マージ

// Easy to use 
context.BulkSaveChanges(); 

// Easy to customize 
context.BulkSaveChanges(bulk => bulk.BatchSize = 100); 

// Perform Bulk Operations 
context.BulkDelete(endItems); 
context.BulkInsert(endItems); 
context.BulkUpdate(endItems); 

// Customize Primary Key 
context.BulkMerge(endItems, operation => { 
    operation.ColumnPrimaryKeyExpression = 
     endItem => endItem.Code; 
}); 
関連する問題