子列表或子列表属性的LINQ NULL异常



我得到以下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();

最新更新