如何解决linq null参考错误与orderby,但firstordefault有效
我有以下代码:
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异常的原因是什么
这是我进入的代码的屏幕截图:
解决方法
请记住,不会在创建linq表达式时对其进行评估,而是仅在必要时对其进行评估(例如:ToList
,或者在您的情况下,依次为OrderBy
和FirstOrDefault
。请参见deferred execution )。因此,空引用异常可以在children
的求值中。
假设ExcludeFromWebsite
和ExcludeFromEcommerce
是布尔值并且不能为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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。