首页 > 解决方案 > 来自 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 异常吗

标签: c#linq

解决方案


  • 首先,我建议避免使用这种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

推荐阅读