2011-09-10 13 views
1

すでにコレクションがある場合は、ループなしで複数のレコードを挿入する方法はありますか?ループの外側にコミットするとパフォーマンスのメリットはほとんどありません。オブジェクトセットを使用して複数のレコードを挿入する

私は文脈があり、ObjectSet<Type>です。私はTypeのコレクションを持っています。これを入れ替えたり、交差させたり、テーブルの中に何を持っていますか。言い換えれば、私は以下から進めたくありません。

+0

任意の擬似コード..私はしかし、あなたの第二段落を理解しすぎてわからないあなたが何を意味するかを説明するには? – scartag

+0

一括挿入が必要なようです。その場合ですか? – TMB

+0

バルクインサートは私が思っているものだと思います。私は、addメソッドが列挙可能メソッドのaddメソッド以上のことをしていることを知りました。それがデータベースに関係するものであれば、複数の追加ごとに一度SaveChangesを呼び出すことは、一括挿入にはなりません。 –

答えて

2

必ずループを使用する必要があります。 AddCollectionまたはAddRangeのようなメソッドではパフォーマンス上のメリットはありません。これらのメソッドは通常、内部コレクションがすべての範囲で拡張され、各Addコールのコレクションを拡張するのではなくコピーされるパフォーマンスの最適化で機能します。 AddObjectは、データをある内部コレクションに渡すので、エンティティを1つずつ処理する必要があります。

EFにバッチデータまたはバルクデータの変更がないため、データベース挿入自体のパフォーマンスを最適化するには、別のソリューションに移動する必要があります。各レコードは、データベースへの個別のラウンドトリップで1つの挿入として渡されます。

+0

ありがとうございます。一般に、私が直面している問題は、EFから始めると、他の多くの内容に基づいて多くのテーブルの多くのレコードを変更するロジックを格納する場所です。あなたの答えは、ピースをメモリに引き込むことは方法ではないかもしれないことを示しています。 –

1

ルーピングと追加を行う拡張メソッドを作成してみることができます。 下記を参照してください。

public static class AddHelper 
{ 


    public void AddAll(this ObjectSet<T> objectSet,IEnumerable<T> items) 
    { 

     foreach(var item in items) 
     { 
      objectSet.AddObject(item); 

     } 

    } 

} 

次に、以下のコードを使用できます。

IEnumerable<EntityName> list = GetEntities(); //this would typically return your list 
Context.ObjectSet.AddAll(list); 
+0

ありがとうございます - 少なくともその論理を隠すでしょう –

0

私は同じ種類のソリューションを探しています。

私はまだEFで直接行う方法を見つけていませんが、それを行う方法があります。 DataTableをパラメータとして受け入れるストアドプロシージャを作成する場合は、Entity ContextでPROCを実行し、そのテーブルをパラメータとして渡すことができます。

何千ものレコードを処理する場合、これはDBに渡す各レコードをループするよりもずっと優れています。

Passing Table Valued Parameters to SQL Server Stored Procedures.

関連する問題