首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自SubList或SubList属性的LINQ NULL异常

来自SubList或SubList属性的LINQ NULL异常
EN

Stack Overflow用户
提问于 2020-10-22 19:11:33
回答 2查看 56关注 0票数 0

我收到以下LINQ查询的空异常

代码语言:javascript
复制
   List<Subscription> product_subscriptions = (from i in _subscriptions
                                                    where i.SubscriptionLines.Any(l => 
                                                     l.ProductNo == isbn)
                                                    select i).ToList();

在某些情况下,SubscriptionLines可以为空,来自子列表的ProductNo也可以为空。我们是否可以在相同的查询中避免这种空异常

EN

回答 2

Stack Overflow用户

发布于 2020-10-22 19:16:58

  • 首先,我建议避免使用from x in y where z语法,因为它会使查询更难阅读。所有很酷的孩子现在都在专门使用扩展方法。

SQL

  • 另外,术语"NULL“(全部大写)应该只在讨论C或时使用。在C#中,它是"null“(在C++中,每个人都应该使用nullptr而不是NULL宏,但这是另一回事)。

  • 这是您使用扩展方法语法的查询(请参阅它有多短?):

List product_subscriptions = _subscriptions .Where( s => s.SubscriptionLines.Any( line => line.ProductNo == isbn )) .ToList();

  • 使其为空安全只需要添加一个额外的.Where()步骤:

List product_subscriptions = _subscriptions .Where( s => s.SubscriptionLines != null ) .Where( s => s.SubscriptionLines.Any( line => line.ProductNo == isbn )) .ToList();

代码语言:javascript
复制
- Note that it doesn't matter if `line.ProductNo` can be null because the `==` operator handles `null` values fine. If `line` itself can be null, then you can workaround that by changing the `Any` predicate to this: `line => line?.ProductNo == isbn`.
票数 4
EN

Stack Overflow用户

发布于 2020-10-22 19:28:14

访问前检查SubscriptionLines is是否为null`。例如:

代码语言:javascript
复制
var query=from s in _subscriptions
          where s.SubscritpionLines !=null 
                && s.SubscriptionLines.Any( line => line.ProductNo == isbn )
          select s;
var product_subscriptions=query.ToList();

您还可以使用null-safe运算符:

代码语言:javascript
复制
var query=from s in _subscriptions
          where s.SubscritpionLines
                 ?.Any( line => line.ProductNo == isbn ) ==true
          select s;

最终会变得更丑陋。使用流畅的语法:

代码语言:javascript
复制
var product_subscriptions = _subscriptions
                              .Where(s=>s.SubscritpionLines !=null 
                                     && s.SubscriptionLines.Any( 
                                           line => line.ProductNo == isbn ))
                              .ToList();

哪个更丑陋,还是:

代码语言:javascript
复制
var product_subscriptions = _subscriptions
                              .Where(s=>s.SubscritpionLines
                                        ?.Any( line => line.ProductNo == isbn ) ==true)
                              .ToList();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64481012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档