问候,我有以下问题.我没有找到它的确切答案,这对我来说真的很有趣.假设我有以下代码从数据库中检索记录(例如,为了将其导出到XML文件).
var result = from emps in dc.Employees
where emps.age > 21
select emps;
foreach (var emp in result) {
// Append this record in suitable format to the end of XML file
}
Run Code Online (Sandbox Code Playgroud)
假设有一百万条记录满足代码中的where条件.会发生什么?所有这些数据将在到达foreach构造时立即从SQL Server检索到运行时内存,或者在必要时检索它,第一个记录,第二个.换句话说,LINQ是否真的通过迭代大型集合来处理这种情况(详情请参阅我的帖子)?
如果没有,在这种情况下如何克服内存问题?如果我真的需要遍历大集合,我该怎么办?借助Count函数计算集合中元素的实际数量,然后按小部分从数据库中读取数据.有没有一种简单的方法来实现LINQ框架的分页?
Ran*_*der 11
所有数据将一次从SQL Server检索,并放入内存.我能想到的唯一解决方法是以较小的块处理数据(如使用Skip()和Take()的页面.但是,当然,这需要更多的SQL Server命中.
这是我写的Linq分页扩展方法,用于执行此操作:
public static IEnumerable<TSource> Page<TSource>(this IEnumerable<TSource> source, int pageNumber, int pageSize)
{
return source.Skip((pageNumber - 1) * pageSize).Take(pageSize);
}
Run Code Online (Sandbox Code Playgroud)
是的,LINQ使用惰性评估.当foreach开始执行时,将查询数据库,但它会一次性获取所有数据(一次只能为一个结果执行数百万次查询效率低得多).
如果您担心一次性引入太多结果,您可以使用Skip和Top一次只获得有限数量的结果(从而对结果进行分页).
| 归档时间: |
|
| 查看次数: |
5250 次 |
| 最近记录: |