【发布时间】:2010-06-16 17:39:19
【问题描述】:
我有一个相当复杂的 linq 到我在网站上显示的实体查询。它使用分页,所以我从不会一次拉下超过 50 条记录。
但我还想为用户提供将完整结果导出为 Excel 或其他文件格式的选项。
我担心的是,为了执行此操作,可能会同时将大量记录全部加载到内存中。
有没有一种方法可以像使用数据读取器一样一次处理 linq 结果集 1 条记录,因此一次只有 1 条记录真正保存在内存中?
我看到了一些建议,即如果您使用 foreach 循环枚举 linq 查询,记录将不会一次全部读入内存,也不会使服务器不堪重负。
有没有人有我可以阅读的内容的链接来验证这一点?
我将不胜感激。
谢谢
【问题讨论】:
-
默认情况下,结果不应该是内存中的集合 - 您是否正在做某事(ToArray、ToList 等)将其全部带入内存?如果没有,只需遍历结果(foreach、Select 等)就可以了。
-
目前我的查询方法确实调用 ToList() 并返回列表,但我可以轻松地更改它以返回 QueryObject。您确定如果我在 IQueryable 上执行 foreach 循环,它会流式传输数据吗?
-
所以你的
ToList()基本上会做类似List<Object> list = new List<Object>(); foreach (Object object in query) { list.Add(object); }的事情。foreach将调用query.MoveNext()。因此,您将所有内容加载到列表中并增加内存使用量。 (我跳过了 GetEnumerator() 部分等,所以这不准确)
标签: c# linq linq-to-entities