我是.NET实体框架的新手,正在尝试迭代数百万行的表中的记录。这是基本代码:
// select the records from the database
var records = from data in dataContext.Messages
select data;
// iterate over the messages
foreach (var record in records)
{
// do nothing
}
在迭代数据时,我得到了“outofmemoryexception”。有什么方法可以改变我的查询或管理ObjectQuery实例的内存?
答案 0 :(得分:4)
我怀疑问题是Entity Framework正在尝试缓存/跟踪对象上下文中的所有这些数据,如果数据集很大,最终会导致OutOfMemory异常。
您可以手动关闭跟踪以避免此问题:
dataContext.Messages.MergeOption = System.Data.Objects.MergeOption.NoTracking;
您当前看到的内存分配在数据上下文中 - 一旦您处置了上下文,此内存最终将被垃圾收集,因此您可以在使用块内实现较小批量的行或手动处理对象上下文回收每批之间的记忆。
答案 1 :(得分:0)
至于更改查询,您可以添加一个where子句来减少返回的记录: