我有一个foreach循环
var axsEntities = GetAxsEntitiesForInvoicing(adapter)
.GroupBy(x => x.AccountUsingAccountIdToAccountId);
foreach(var gbAccount in axsEntities)
{
int i = gbAccount.count();
}
现在当我在没有循环的情况下运行它时运行正常,但是使用循环它会占用太多内存,在这种情况下为3千兆字节。这可能是什么原因?
由于
答案 0 :(得分:5)
没有循环,没有任何事情真的发生。
axsEntities
只是一个具有延迟执行的IEnumerable
创建它总是很便宜。只有当迭代它(foreach
)时才会获取和计算。
所以你可能有很多元素,或.count()
使用大量内存。
答案 1 :(得分:0)
我们必须看看axsEntitie的确定类型,但我猜它是IQueryable?如果是这样,没有for循环,你实际上并没有在该集合上做任何。使用for循环,您实际上正在迭代结果集。
答案 2 :(得分:0)
第一个表达式可能是惰性评估的。试试一个简单的
var test = axsEntities.ToList();
看看是否也会占用大量内存。
答案 3 :(得分:0)
问题可能不是forreach循环,而是在循环中执行延迟的GroupBy逻辑。
除非GetAxyEntitiesForInvoicing方法是IQueryable并且不返回所有实体,否则分组必须在内存中进行。
答案 4 :(得分:0)
foreach循环中的gbAccount.count();
怎么样?这可能不是一个好主意。我首先检查一下是否负责使用珍贵的内存。我的建议是你可以提出更专业的查询,例如GetAccountsCountForGroupedAxsEntitiesForInvoicingByAccountUsingAccountIdToAccountIdWithSauce
,这听起来对我来说真是个好名字。
和平