У меня есть цикл foreach
var axsEntities = GetAxsEntitiesForInvoicing(adapter) .GroupBy(x => x.AccountUsingAccountIdToAccountId); foreach(var gbAccount in axsEntities) { int i = gbAccount.count(); }
Теперь, когда я запускаю это без цикла, он работает нормально, но с циклом он использует слишком много памяти, в данном случае 3 гигабайта.Что может быть причиной этого?
Спасибо
Без цикла на самом деле ничего не происходит.
axsEntities - это просто IEnumerable с отложенным выполнением. Создание это всегда дешево. Только при переборе (foreach) вещи выбираются и вычисляются.
axsEntities
foreach
Так что у вас может быть очень много элементов, или .count() использует много памяти.
.count()
Как насчет gbAccount.count(); внутри цикла foreach? Это не может быть хорошей идеей. Я бы сначала проверил, отвечает ли это за использование драгоценной памяти. Мой совет: Вы можете придумать более специализированный запрос , например. GetAccountsCountForGroupedAxsEntitiesForInvoicingByAccountUsingAccountIdToAccountIdWithSauce, это звучит как очень хорошее имя для меня.
gbAccount.count();
GetAccountsCountForGroupedAxsEntitiesForInvoicingByAccountUsingAccountIdToAccountIdWithSauce
Мир
Скорее всего, проблема не в цикле forreach, а в логике GroupBy, которая выполняет задержку в цикле.
Если метод GetAxyEntitiesForInvoicing не является IQueryable и не возвращает все сущности, группировка должна происходить в памяти.
Первое выражение, вероятно, лениво оценивается.Попробуйте простой
var test = axsEntities.ToList();
, чтобы увидеть, использует ли он также много памяти.
Мы должны были бы увидеть, что такое тип axsEntitie, но я предполагаю, что это IQueryable?Если так, то без цикла for вы на самом деле не делаете что-либо на этом наборе.С помощью цикла for вы фактически повторяете набор результатов.