Ope*_*per 5 c# sql-server entity-framework linq-to-sql
我有一个返回超过212Milion行的查询.我尝试使用.ToList()但显然它会进入OutOfMemoryException.我案件的最佳选择是什么?
我也试过使用, Skip(fetchedrows).Take(1000).ToList()但性能真的慢下来跳过阶段和查询永远不会结束.
如果可能,返回一个可枚举值。这样,您就可以继续向前(并且仅向前)滚动过多的行,而无需立即将其放入内存中,这很可能永远不会起作用。如果实现正确(这也取决于您的数据源),您可以一次读取和处理一行,几乎不使用任何内存。
有很多技术可以做到这一点,但我经常使用的最简单的方法是yield return,它将生成自己的状态机。
如今,实体框架确实会自行传输结果。您唯一不应该做的事情是调用ToList()或类似的方法,这些方法会将数据库中的所有行加载到内存中。只需迭代结果,就像它们是常规集合一样。(对于 EF6 及更早版本,您可以使用AsStreaming()扩展方法。)如果这对您不起作用,您可以随时恢复到逐行DataReader读取和返回的位置。