linq null参考错误与orderby,但firstordefault有效

时间:2020-09-24 11:30:56

标签: c# linq

我有以下代码:

IEnumerable<VariantChild> children = src.Variants
    .Where(v => !v.ExcludeFromWebsite && !v.ExcludeFromEcommerce)
    .SelectMany(v => v.Children)
    .Where(c => c.Price > 0 && !c.ExcludeFromWebsite && !c.ExcludeFromEcommerce);

if (children.Any())
{
    VariantChild child  = children.OrderBy(c => c.Price).FirstOrDefault();  // this line is throwing a null reference error

    if (child != null)
    {
        dest.Price = child.Price;
    }
}

但是它在突出显示的行上引发了空引用异常。如果我删除了orderby,则代码可以正常工作,因此我认为可能与价格为空有关-但不能为两倍,因为它是double。

逐步执行代码后,.Any()返回true,但是如果将其更改为.Count(),则会得到空异常

如果我逐步检查一下子对象-我可以看到结果视图为null,那么.Any()不应该返回false(尽管为什么FirstOrDefult()返回一个变异子对象?

任何人都知道导致null异常的原因是什么

这是我进入的代码的屏幕截图:

Screenshot

1 个答案:

答案 0 :(得分:4)

请记住,不会在创建linq表达式时对其进行评估,而是仅在必要时对其进行评估(例如:ToList,或者在您的情况下,依次为OrderByFirstOrDefault。请参见deferred execution )。因此,空引用异常可以在children的求值中。

假设ExcludeFromWebsiteExcludeFromEcommerce是布尔值并且不能为null,而Price是double值并且不能为null。仅保留Children女巫是IEnumerable(因为在SelectMany中使用过),因此它可以为空。

此外,在您的屏幕快照中,堆栈跟踪指向SelectManyIterator

您应检查Children是否不为空:

IEnumerable<VariantChild> children = src.Variants
  .Where(v => !v.ExcludeFromWebsite && !v.ExcludeFromEcommerce)
  .SelectMany(v => v.Children ?? Enumerable.Empty<T>()) // T is the type of element in Children
  .Where(c => c.Price > 0 && !c.ExcludeFromWebsite && !c.ExcludeFromEcommerce);
相关问题