1

有没有办法强制实体框架一次从 Db 读取一条记录?

基本上让它像一个一样工作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

实体框架实际上是一次读取一个实体。如果您在 IQueryable 上有一个 foreach 循环(即您没有强制执行评估),那么实体框架只会在您访问它时实现每个实体。这就是为什么在使用延迟加载时需要启用 MARS(多个活动结果集)的原因 - 当您启动嵌套查询时,外部查询仍在进行中。

编辑

在 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 回答