IS est un problème d'exécution différée. Cependant, mon problème provient du fait que je ne peux pas déterminer POURQUOI cette exécution est parfois retardée, et pas d'autres fois.LINQ Exécution étrange - Inconsistantly Consistant?
code:
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();
Problème:
Ce code est en production, et fonctionne comme prévu. J'ai récemment changé ailleurs et j'ai constaté que ce test ne fonctionnait pas dans nos tests unitaires. Lorsque je passe à travers cette fonction, ce qui suit se produit:
- Avant d'atteindre ce code, j'ai vérifié les données d'entrée. Tous les éléments de
lineItems
. Chaque article a en tant que valeur pour.FlatShippingRate
- QualifyFreeFlatShipping est
true
- exécution de code atteint la statment LINQ à la ligne 4 (
freeFlatItems = etc...
) - Valeur de
freeFlatItems
reste inchangée tant que l'exécution se poursuit à la ligne 6 (decimal? freeFlatShippingTotal = etc...
) .Sum
est exécuté sur une liste vide.- En atteignant la ligne 8 (
var globalShippingPromos = etc...
) la valeur defreeFlatItems
enfin met à jour à ce que devrait être être. Cependant ... la somme a été exécutée sur la valeur précédente, et mon total d'expédition est incorrect.
La question (s):
- Pourquoi est-ce toujours en retard? Je pensais
.ToList()
forcé l'exécution de la linq pour générer leIList<T>
- Pourquoi cela se comporte différemment d'une manière consistante? (Mon test se comporte toujours de cette façon, la production fonctionne bien, ce code dans LinqPad fonctionne bien). Et avant que vous le suggériez, j'ai validé mon test est construit correctement. À la fois dans le code de test et dans la première étape ci-dessus en validant les données d'entrée dans le débogueur.
L'autre code plus bas a besoin de la liste des éléments freeFlat. – Aren