Linq2Sql:如何管理大型结果集?

时间:2010-06-30 07:13:05

标签: c# linq-to-sql

假设我有一个非常大的结果集(+100.000行)的查询,我需要遍历并执行更新:

var ds = context.Where(/* query */).Select(e => new { /* fields */ } );

foreach(var d in ds)
{
//perform update
}

我很好用这个过程需要很长时间才能执行,但我的服务器上的内存量有限。

foreach会发生什么?整个结果是从数据库中一次获取的吗?

使用Skip和Take分别进行更新是否会更好?

3 个答案:

答案 0 :(得分:1)

最好的方法是使用Skip并选择yes并确保每次更新后都处理DataContext(使用“using”)

你可以查看我的问题,有一个类似问题的好解决方案:Out of memory when creating a lot of objects C#

答案 1 :(得分:1)

你基本上滥用LINQ2SQL - 不是为此而做的。

  • ALl结果被记录在内存中。
  • 完成后,您的更改会被写出一次。

这将是缓慢的,它将是 - 嗯 - 使用TONS的内存。给定有限的内存 - 不可能。

请勿一次加载所有数据。尝试使用部分结果集(每个1000-2500项)运行多个查询。

ORM不适用于大规模操纵。

答案 2 :(得分:1)

您是否可以一次性使用存储过程来更新所有内容?