web-dev-qa-db-ja.com

一括挿入の方法-エンティティへのLinq

Linq to Entitiesを使用して一括挿入/一括挿入を行う方法の例が見つかりません。一括挿入の方法を知っていますか?

36
Luke101

時には、単にモデルを混合する必要があります。おそらく、リポジトリのこの部分には SqlBulkCopy を使用します(これは一括コピーAPIに直接プラグインされるため)、残りの一部にはEntity Frameworkを使用します。また、必要に応じて、直接ADO.NETを少し使用します。結局のところ、目標は仕事を成し遂げることです。

22
Marc Gravell

LINQ to Entitiesで一括挿入を行う方法の完全な例については、 http://archive.msdn.Microsoft.com/LinqEntityDataReader を参照してください。 SqlBulkCopyを簡単に使用できるラッパーです。

@Marc Gravellは正解です。時々、作業を完了するためにモデルを混合する必要があります。

12
Contango

EFエンティティ(またはプロパティ名が列名と一致する限り、任意の種類のオブジェクト)を一括挿入するクラスを作成しました。

このクラスは、バッチサイズ、挿入前後のイベント、キューに入れられた挿入、および「firehoseモード」のカスタマイズをサポートします(10億のオブジェクトを指定すると、バッチサイズが考慮されます)。

6
Ronnie Overby

bulk insert extension を使用してそれを行うことができます

SqlBulkCopyとカスタムデータリーダーを使用して最大のパフォーマンスを実現します。その結果、通常の挿入やAddRangeを使用するよりも20倍以上速くなります

Efbulkinsert拡張機能の使用例:

context.BulkInsert(hugeAmountOfEntities);
3
maxlego

データベースに大量のデータを挿入するために、私はすべての挿入情報をリストに収集し、このリストを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;
        }
2
Amit Bisht