使用foreach迭代IQueryable会导致内存不足异常

Gle*_*eno 14 c# linq linq-to-sql

我正在使用foreach/IQueryable和LINQ-to-SQL迭代一个小的(~10GB)表.看起来像这样:

using (var conn = new DbEntities() { CommandTimeout = 600*100})
{
     var dtable = conn.DailyResults.Where(dr => dr.DailyTransactionTypeID == 1);
     foreach (var dailyResult in dtable)
     {
        //Math here, results stored in-memory, but this table is very small. 
        //At the very least compared to stuff I already have in memory. :)
     }
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio调试器在foreach循环的基础上短暂地抛出一个内存不足的异常.我假设dtable的行没有被刷新.该怎么办?

Amy*_*y B 18

IQueryable<DailyResult>在枚举循环的任何迭代之前,dtable将尝试将整个查询结果加载到内存中.它在foreach循环的迭代期间不加载一行.如果您需要该行为,请使用DataReader.


She*_*ock 7

你打电话~10GB小?你有一种很好的幽默感!

您可以考虑以块(也称为分页)加载行.

conn.DailyResults.Where(dr => dr.DailyTransactionTypeID == 1).Skip(x).Take(y);
Run Code Online (Sandbox Code Playgroud)

  • 我不确定,你的意思是告诉我这种分页方法高效吗?我只是很惊讶 IQueriable 想要将东西加载到内存中。我的意思是,为什么不将其做成某种数组来向无助的程序员表明其邪恶的意图。:) (2认同)