1

一度に 1 つのレコードを Db から読み取るように Entity Framework を強制する方法はありますか?

基本的にそれを次のように機能させるためにSqlDataReader(私は前方のみを読む必要があり、データをまったく変更しません!)

例を使って質問を簡単にするために、以下のループでは、EF が反復ごとに 1 つの都市を取得するようにします。

var context = new CityEntities();

var cities = from c in context.Cities
             select c;

foreach (var c in cities) {
    Console.WriteLine(c);   // I want to have only 1 city in the memory at this point
}

理由:強い型付けの利点を利用してクエリを作成し、私の場合はクエリを文字列として記述したくないためです。

4

2 に答える 2

4

Entity Framework は、実際には一度に 1 つのエンティティを読み取っています。IQueryable に foreach ループがある場合 (つまり、評価を強制していない場合)、Entity Framework は、各エンティティに到達した場合にのみ、各エンティティを実体化します。これが、遅延読み込みを使用するときに MARS (Multiple Active Result Sets) を有効にする必要がある理由です。ネストされたクエリを開始すると、外側のクエリはまだ進行中です。

編集

EF6 では、デフォルトの戦略は、接続の回復力をサポートできるようにバッファリングすることです。ただし、接続の回復力が使用されていない場合は、バッファリングをオフにすることができます。

于 2012-10-16T17:02:59.267 に答える
-1

これを試すことができます

while(cities.Any())
{
    var city = cities.First();
    cities = cities.Skip(1);
}

しかし、非常に最適でない SQL になる可能性があります。したがって、すべてのレコードを一度にロードすることを強くお勧めします。

于 2012-10-16T15:45:39.880 に答える