c# - 来自 SubList 或 SubList 属性的 LINQ NULL 异常
问题描述
我收到以下 LINQ 查询的 NULL 异常
List<Subscription> product_subscriptions = (from i in _subscriptions
where i.SubscriptionLines.Any(l =>
l.ProductNo == isbn)
select i).ToList();
看起来 SubscriptionLines 在某些情况下可以为空,而 ProductNo [来自子列表] 也可以为空。我们可以在同一个查询中避免这个 NULL 异常吗
解决方案
首先,我建议避免使用这种
from x in y where z
语法,因为它使查询更难阅读。现在所有酷孩子都在专门使用扩展方法。此外,术语“
NULL
”(全部大写)只应在讨论 C 或 SQL 时使用。在 C# 中它是“null
”(在 C++ 中,每个人都应该使用nullptr
而不是NULL
宏,但这是另一个咆哮)。这是您使用扩展方法语法的查询(看看它有多短?):
List<Subscription> product_subscriptions = _subscriptions .Where( s => s.SubscriptionLines.Any( line => line.ProductNo == isbn ) ) .ToList();
使其为空安全只需要添加一个额外的
.Where()
步骤:List<Subscription> product_subscriptions = _subscriptions .Where( s => s.SubscriptionLines != null ) .Where( s => s.SubscriptionLines.Any( line => line.ProductNo == isbn ) ) .ToList();
line.ProductNo
请注意,是否可以为 null并不重要,因为==
运算符可以很好地处理null
值。如果line
它本身可以为空,那么您可以通过将Any
谓词更改为 this: 来解决此问题line => line?.ProductNo == isbn
。
推荐阅读
- kotlin - Java 到 Kotlin 数组的转换,为什么在不同的场景中会有所不同?
- nodemon - 使用npm在nodejs中安装nodemon的问题
- amazon-web-services - AWS X-Ray:如何通过 Lambda --> SNS --> Lambda 传播 TraceId?
- ios - Ellysis 蓝牙嗅探 Apple Airpods
- html - 如何使用浏览器访问受限网站区域(权限设置为 700)?
- c++ - inline 和 __attribute__ inline 有什么区别?
- java - 如何按优先级迭代?
- android - new NotificationCompat.Builder(Context) - 如何从 url 设置大图标()
- angular - 带有可选查询参数的角路由器
- wordpress - 我正在尝试在我的 wordpress 网站上摘录一条长评论