質問: 私はEFバージョン6.1.1を使用してC#でEntity Frameworkを使用してデータベーステーブルをダンプしようとしています。 foreachループが一度に1行ずつロードすることを期待していましたが、徐々にすべての行がロードされ、メモリ不足になります。 ``` foreach (Quote L in context.Quotes) sw.WriteLine( "INSERT INTO [dbo].[Quote] ([QuoteId], [BookId], [VerbTenseId], [Form], [Quotation]) VALUES (%1,%2,%3,N'%4',N'%5')", L.QuoteId, L.BookId, L.VerbTenseId, L.Form, L.Quotation); ``` 上記のコードでは、コンテキストはデータベースに既に初期化されているDatabaseContextであり、QuotesはQuoteレコードの有効なテーブルです。私はすべてのレコードをバックアップ用のファイルにダンプしようとしています。明らかに(以前に示唆したように)私はEntity Frameworkを放棄してDataReaderを使用してデータベーステーブルを反復することができましたが、フレームワークはメモリに収まらないほど大きなテーブルの反復を可能にします。 **これを可能にするエレガントな方法(おそらく文脈のどこかの旗)はありますか?** 通常、結果セットは小さい(数千)が、この場合は数百万に達する。 以前のバージョンのフレームワークで動作するオプションがあるようですが、私が誤解していない限り、それらのメソッドとフラグは存在しなくなりました。 これはテストコードであり、通常のデータベースバックアップではありません。私は自分のコードを表現するためのより良い方法を探しているわけではありません。私はEFを使用するエレガントな方法を探しています。 EFがそのようなサポートを欠いているのは私の答えです。 **この例を混乱させないでください。EFを使用してすべての行をメモリにロードしてそこに保存せずにデータベーステーブルを列挙する方法がある場合は、答えてください。私は他の例をコード化し、データベースバックアップを達成するための他のオプションを提供することができます。これは一例です。**
回答: 私はそれをテストしていませんが、 `foreach (Quote L in context.Quotes.AsNoTracking()) {...}`試してみてください`foreach (Quote L in context.Quotes.AsNoTracking()) {...}` 。 `.AsNoTracking()`はキャッシュ内にエンティティを置くべきではないので、範囲外のときにGCによって消費されると仮定します。 別の方法は、バッチ処理(上位N個のエンティティを選択、処理、次の上位Nを選択)を実装することです。この場合は、繰り返しごとに新しいコンテキストを作成して作成し、適切なOrderBy()をクエリで使用するようにしてください。