替代.ToList()来返回大量数据?

时间:2017-02-27 19:30:56

标签: c# sql-server entity-framework linq-to-sql

我有一个返回超过212Milion行的查询。我尝试使用.ToList(),但显然是OutOfMemoryException。对我来说最好的选择是什么?

我还尝试使用Skip(fetchedrows).Take(1000).ToList(),但跳过阶段和查询的性能确实会慢下来。

1 个答案:

答案 0 :(得分:3)

如果可能,返回一个可枚举的。通过这种方式,您可以继续向前滚动(仅向前)通过过多的行,而无需立即将其放入内存中,这很可能永远不会起作用。如果正确实现(它还取决于您的数据源),您可以一次读取和处理一行,几乎没有使用内存。

有很多技术可以做到这一点,但我经常使用的最简单方法是yield return,它将生成自己的状态机。

现在,实体框架确实会自动传输结果。 所做的唯一事情是调用ToList()或类似的方法,这些方法会从内存中加载数据库中的所有行。只需迭代结果就好像它们是常规集合一样。 (对于EF6及更早版本,您可以使用AsStreaming()扩展方法。)如果这对您不起作用,您可以随时恢复到您阅读的DataReader并逐行返回。< / p>