LINQ奇怪的执行 - 不一致一致?

时间:2010-07-13 16:58:47

标签: c# .net linq delayed-execution

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();

问题:

此代码已投入生产,并按预期工作。我最近在其他地方进行了更改,发现此测试在我们的单元测试中无效。当我单步执行此功能时,会发生以下情况:

  1. 在达到此代码之前,我验证了输入数据。 lineItems中的所有项目。每个商品都有作为.FlatShippingRate
  2. 的值
  3. QualifyFreeFlatShipping为true
  4. 代码执行到达第4行(freeFlatItems = etc...
  5. 的linq语句
  6. freeFlatItems的值保持不变,因为执行继续到第6行(decimal? freeFlatShippingTotal = etc...
  7. .Sum在空列表中执行。
  8. 到达第8行(var globalShippingPromos = etc...)后,freeFlatItems的值最终会更新为应该的内容。但是...总和是按上一个值运行的,而且我的运费总额不正确。
  9. 问题:

    1. 为什么这仍然被推迟?我以为.ToList()强制执行linq来生成IList<T>
    2. 为什么这种情况会以一致的方式表现出来? (我的测试总是这样,生产工作正常,LinqPad中的这段代码工作正常)。在你提出建议之前,我已经验证了我的测试是否正确构建。通过验证调试器中的输入数据,在测试代码和上面的第一步中都可以。

2 个答案:

答案 0 :(得分:2)

1

此处没有延迟执行。 ToList()强制“Where”,立即计算“Sum”并存储在十进制中。错误必须在其他地方

2

当您在第8行之后第二次评估总和时,请说:

decimal? freeFlatShippingTotal2 = freeFlatItems.Sum(l => l.FlatShippingRate);

然后你得到正确的价值?那么,freeFlatShippingTotal2!= freeFlatShippingTotal?

答案 1 :(得分:0)

我不认为这是延迟执行的问题。但我可以建议一种更清晰的方式来编写代码。

decimal freeFlatShippingTotal = 0.0m;
if(QualifyFreeFlatShipping)
    freeFlatShippingTotal = lineItems.Sum(l => l.FlatShippingRate ?? 0.0m);