Это IS проблема с отложенным выполнением. Однако моя проблема связана с тем, что я не могу установить, ПОЧЕМУ это выполнение иногда откладывается, а не в других случаях.
Код:
IList<LineItem> freeFlatItems = new List<LineItem>();
if(QualifyFreeFlatShipping)
freeFlatItems = lineItems.Where(l => l.FlatShippingRate != null).ToList();
decimal? freeFlatShippingTotal = freeFlatItems.Sum(l => l.FlatShippingRate);
var globalShippingPromos = _promoService.GetGlobalShippingPromos();
Проблема:
Этот код находится в работе и работает как положено. Я недавно сделал changese в другом месте и обнаружил, что этот тест не работал в нашем модульном тестировании. Когда я выполняю эту функцию, происходит следующее:
- Перед тем, как получить этот код, я проверил входные данные. Все предметы в
lineItems
. Каждый элемент имеет в качестве значения для .FlatShippingRate
- QualifyFreeFlatShipping is
true
- Выполнение кода достигает строки linq в строке 4 (
freeFlatItems = etc...
)
- Значение
freeFlatItems
остается неизменным, так как выполнение продолжается до строки 6 (decimal? freeFlatShippingTotal = etc...
)
.Sum
выполняется через пустой список.
- По достижении строки 8 (
var globalShippingPromos = etc...
) значение freeFlatItems
окончательно обновляется до того, что должно быть . Однако ... сумма была получена с предыдущим значением, и итоговая стоимость доставки неверна.
Вопрос (ы):
- Почему это все еще откладывается? Я думал,
.ToList()
заставил выполнение linq сгенерировать IList<T>
- Почему это ведет себя по-разному в последовательной манере? (Мой тест всегда ведет себя так, производство работает нормально, этот код в LinqPad работает отлично). И прежде чем вы это предложите, я проверил, что мой тест составлен правильно. Как в тестовом коде, так и в первом шаге, проверяя входные данные в отладчике.