2

データベースの他のデータに基づいて、データベースに非常に大きな挿入物を挿入したい場合があります。このアプリケーションのパフォーマンス上の問題は、SqlBulkCopyを使用しても、私の好みに合わせてこのプロセスが遅くなります。Entity Frameworkを使用してデータベース上でコマンドを実行する

質問:データベースにSQLコードを自動的に生成して実行するためにLinqからEFを使用できますか?何も返されませんでしたか?それは私に可能性があるように見える、私はちょうどそれを回避する方法は考えていない。

ここには前提があります:次のようなことができますか?

myContext.OutputTable.AddRange(
    myContext.TableA.Join(
     myContext.TableB, 
     a => a.myAKey, 
     b => b.myBKey, 
     (a, b) => new { a.fieldA, a.fieldB, b.fieldC }).Select(
    output => new OutputTable 
    { 
     myOutputColumnA = output.FieldA, 
     myOutputColumnB = output.FieldB, 
     myOutputColumnC = output.FieldC 
    }) 
); 

多分私がここでやろうとしていることは明らかではありません。私は基本的には、EntityFrameworkがアプリケーションにデータを返すことなく、TableAとTableBの両方のデータを使って "OutputTable"にデータを挿入しようとしています。さて、この種のinsert文を実行するにはExecuteNonQuery()を使用することが可能ですが、最終的にはいくつかの異なる理由でこれをしたくありません。C#でコード全体を維持したいと思っています。私はLinqが提供するデバッグの面を維持したい(私はVisual Studioを使用しているので、コードが失敗する同じ場所でクエリが失敗するのを助ける)。

私はLinq to EFがデータベース上で実行するSQLを生成することを知っていますので、これを達成することが可能です(実際にコードが実行されるように意図的に遅延読み込みを無視する必要があります)。上記のコードは実行されません。私は、新しいオブジェクトをSelect()ステートメントの内部でインスタンス化することはできないと考えています(LinqからEFへの対処方法はわかりません)。最終的に、これは実行可能な道なのでしょうか?もしそうでなければ、実行可能な選択肢はありますか?

+0

SqlBulkCopyの良い説明は、どのくらいのデータ、あなたが話しているの?何百?何千?何百万? – Fran

+0

@Fran現実的には、数万から数百万の範囲です。私はそれが定期的に大きくなることは期待していませんが、それが実行される最初の時間は何千万もの可能性があります。 – LightToTheEnd

+0

これは、ストアドプロシージャを記述することによってのみ実現できます。安全な.Netアプリケーションが自分自身で所有していないデータ(つまりメモリコンテンツ)を操作できるとは思わないでください。とにかく、「エンティティフレームワーク」と「高速」は、終端における矛盾です。 –

答えて

1

EFを使用すると、SqlBulkCopyより高速になることはありません。 EntityFrameworkはORMなので、可能なすべてのオプションをオフにしても、SqlBulkCopyよりも遅くなります。なぜなら、生のSQLデータを取得してオブジェクトを生成したいからです。

SqlBulkCopyはデータベースにFirehoseを開くようなものです。制約を無効にし、通常のDBへの書き込みとは異なるメカニズムを使用します。

これよりも速いものは、Gertのコメントのようにデータベースに格納する必要があります。

はここで古いのですが、ここでは

http://www.sqlbi.com/wp-content/uploads/SqlBulkCopy-Performance-1.0.pdf

関連する問題