假设我有一个非常大的结果集(+100.000行)的查询,我需要遍历并执行更新:
var ds = context.Where(/* query */).Select(e => new { /* fields */ } );
foreach(var d in ds)
{
//perform update
}
我很好用这个过程需要很长时间才能执行,但我的服务器上的内存量有限。
foreach会发生什么?整个结果是从数据库中一次获取的吗?
使用Skip和Take分别进行更新是否会更好?
答案 0 :(得分:1)
最好的方法是使用Skip并选择yes并确保每次更新后都处理DataContext(使用“using”)
你可以查看我的问题,有一个类似问题的好解决方案:Out of memory when creating a lot of objects C#
答案 1 :(得分:1)
你基本上滥用LINQ2SQL - 不是为此而做的。
这将是缓慢的,它将是 - 嗯 - 使用TONS的内存。给定有限的内存 - 不可能。
请勿一次加载所有数据。尝试使用部分结果集(每个1000-2500项)运行多个查询。
ORM不适用于大规模操纵。
答案 2 :(得分:1)
您是否可以一次性使用存储过程来更新所有内容?