Linq to Entitiesを使用して一括挿入/一括挿入を行う方法の例が見つかりません。一括挿入の方法を知っていますか?
時には、単にモデルを混合する必要があります。おそらく、リポジトリのこの部分には SqlBulkCopy
を使用します(これは一括コピーAPIに直接プラグインされるため)、残りの一部にはEntity Frameworkを使用します。また、必要に応じて、直接ADO.NETを少し使用します。結局のところ、目標は仕事を成し遂げることです。
LINQ to Entitiesで一括挿入を行う方法の完全な例については、 http://archive.msdn.Microsoft.com/LinqEntityDataReader を参照してください。 SqlBulkCopyを簡単に使用できるラッパーです。
@Marc Gravellは正解です。時々、作業を完了するためにモデルを混合する必要があります。
EFエンティティ(またはプロパティ名が列名と一致する限り、任意の種類のオブジェクト)を一括挿入するクラスを作成しました。
このクラスは、バッチサイズ、挿入前後のイベント、キューに入れられた挿入、および「firehoseモード」のカスタマイズをサポートします(10億のオブジェクトを指定すると、バッチサイズが考慮されます)。
BulkInserter<T>
bulk insert extension を使用してそれを行うことができます
SqlBulkCopyとカスタムデータリーダーを使用して最大のパフォーマンスを実現します。その結果、通常の挿入やAddRangeを使用するよりも20倍以上速くなります
Efbulkinsert拡張機能の使用例:
context.BulkInsert(hugeAmountOfEntities);
データベースに大量のデータを挿入するために、私はすべての挿入情報をリストに収集し、このリストをDataTable
に変換していました。次に、そのリストをSqlBulkCopy
を介してデータベースに挿入します。
生成したリストを送信する場所LiMyList
データベースに挿入するすべてのバルクデータの情報が含まれています
それを一括挿入操作に渡します
InsertData(LiMyList, "MyTable");
ここで、InsertData
は
public static void InsertData<T>(List<T> list,string TabelName)
{
DataTable dt = new DataTable("MyTable");
clsBulkOperation blk = new clsBulkOperation();
dt = ConvertToDataTable(list);
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
using (SqlBulkCopy bulkcopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString))
{
bulkcopy.BulkCopyTimeout = 660;
bulkcopy.DestinationTableName = TabelName;
bulkcopy.WriteToServer(dt);
}
}
public static DataTable ConvertToDataTable<T>(IList<T> data)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
foreach (PropertyDescriptor prop in properties)
table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
foreach (T item in data)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
table.Rows.Add(row);
}
return table;
}