早上好!
其实我正在玩EF atm一点点,我需要你的帮助:
以下场景:我有一个包含大量数据的表。如果我通过EF查询该表,则所有记录都会加载到内存中。
例如
var counter = default(int);
using (var myEntities = new MyEntities())
{
foreach (var record in myEntities.MySpecialTable)
{
counter++;
}
}
因此,我浏览MySpecialTable的所有记录并计算counter
。
当我看看Taskmanager,或其他任何向我显示我的应用程序的内存消耗时,它告诉我:400Mb。 (因为数据)
如果我再次在表中运行,内存消耗将增加一倍。
我已经尝试过调用GC,但它不起作用。
为什么每次运行的所有记录都存储在内存中(并且未发布)? 他们在哪里存储? 有没有办法让EF查询像DataReader一样? 或者还有其他任何与EF一样优雅的ORM吗?
修改
不,我没有做那样的计数......这只是为了展示迭代:)
答案 0 :(得分:1)
首先,我希望你实际上并没有这样做; Count方法效率更高。但假设这只是显示内存问题的演示代码:
Change the MergeOption property of the ObjectQuery to NoTracking。这告诉实体框架您无意修改实体,因此无需费心跟踪其原始状态。