我得到以下LINQ查询的NULL异常
List<Subscription> product_subscriptions = (from i in _subscriptions
where i.SubscriptionLines.Any(l =>
l.ProductNo == isbn)
select i).ToList();
在某些情况下,SubscriptionLines可能为NULL,ProductNo[from sublist]也可能为NULL。我们能在同一查询中避免这种NULL异常吗
-
首先,我建议避免使用
from x in y where z
语法,因为它会使查询更难阅读。现在,所有酷孩子都在专门使用扩展方法。 -
此外,术语";CCD_ 2";(大写(只应在讨论C或SQL时使用。在C#中;CCD_ 3";(在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
本身可以为null,那么您可以通过将Any
谓词更改为以下内容来解决此问题:line => line?.ProductNo == isbn
在访问SubscriptionLines is
之前检查它是否为null。例如:
var query=from s in _subscriptions
where s.SubscritpionLines !=null
&& s.SubscriptionLines.Any( line => line.ProductNo == isbn )
select s;
var product_subscriptions=query.ToList();
您也可以使用空安全运算符:
var query=from s in _subscriptions
where s.SubscritpionLines
?.Any( line => line.ProductNo == isbn ) ==true
select s;
结果有点难看。使用流利的语法:
var product_subscriptions = _subscriptions
.Where(s=>s.SubscritpionLines !=null
&& s.SubscriptionLines.Any(
line => line.ProductNo == isbn ))
.ToList();
哪个更丑或者:
var product_subscriptions = _subscriptions
.Where(s=>s.SubscritpionLines
?.Any( line => line.ProductNo == isbn ) ==true)
.ToList();