バッチ処理等で大量データなどを出力する場合、 LINQ to Entity や EntitySQL ObjectQuery では一端データをメモリにため込んでしまうため、パフォーマンスに問題が発生する可能性があります。
その場合は、 EntityClient 名前空間のクラス EntityDataReader を使用して データソースに順次アクセス(Forward-Only) することで、メモリの消費を抑えることができます。
動作の確認は、.NET3.5SP1のEntityFramework1 を使用しています。
下の例では Accountというエンティティの一覧を取得して、コンソールに出力しています。EntityCommandに指定するのはEntitySQLです。
static void EntityDataReaderTest() { using (EntityConnection cn = new EntityConnection("name=TestEntities")) { string sql = "SELECT VALUE Account from TestEntities.Account"; EntityCommand cmd = cn.CreateCommand(); cmd.CommandText = sql; cmd.CommandType = System.Data.CommandType.Text; cn.Open(); using (EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) { while (reader.Read()) { Console.WriteLine(reader["name"] as string); } } } }
説明は以上です。指摘点などありましたらご連絡ください。
さんのコメント: さんのコメント: