实体框架 foreach 表超过 800,000 条记录

Xap*_*ann 4 c# sql-server entity-framework

迭代具有大量记录的表的正确方法是什么?我需要评估表中的所有记录。我正在使用实体框架连接 MS SQL 数据库并从中获取信息。我使用的是一个简单的foreach循环;

foreach (var x in MyEntity.MyTable)
{
   //logic process
}
Run Code Online (Sandbox Code Playgroud)

这非常适合少于 500,000 条记录的表(没有确切的数字)。问题是当它遇到更大的表(例如超过 800,000 条记录)时,应用程序会变得不稳定并会崩溃。我应该注意到该应用程序使用大量 RAM(大约 4-6GB)

Igo*_*gor 5

使用AsNoTracking

foreach (var x in MyEntity.MyTable.AsNoTracking())
Run Code Online (Sandbox Code Playgroud)

这将确保在迭代表中的每个项目时,EF 不会跟踪它,并且不会保留在表中,DbContext因此必要时 CLR 可以对实例进行 GC。

请注意,这意味着您无法对项目进行任何更改并希望将这些更改保留回 DbContext,您必须附加实例才能执行此操作。


这确实假设您未显示的代码中不存在消耗大量内存的其他问题。

  • 这仍然会触发从数据库请求 800K 记录的查询,这很可能是不必要的。 (2认同)