加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – LINQ任何失败?

发布时间:2020-12-15 19:27:40 所属栏目:百科 来源:网络整理
导读:是否有任何理由为什么以下代码中的Any函数可能会失败? var orders = db.Order.Where(order = order.Item.Any());foreach (var order in orders){ var first = order.Item.First(); // NullReferenceException thrown here: order.Item == null} 也许我只是
是否有任何理由为什么以下代码中的Any函数可能会失败?

var orders = db.Order.Where(order => order.Item.Any());
foreach (var order in orders)
{
    var first = order.Item.First();  // NullReferenceException thrown here: order.Item == null
}

也许我只是在这里误解了一些东西,但在我看来,order.Item永远不会因为早期的Any语句而为null.

编辑:如果我确保表达式被评估而不是通过在那里放置ToList而延迟,我得到另一个异常,因为order.Item序列没有项目,这也让我感到困惑:

var orders = db.Order.Where(order => order.Item.Any()).ToList();
foreach (var order in orders)
{
    var first = order.Item.First();  // System.InvalidOperationException thrown here: order.Item.Count == 0
}

解决方法

计算订单的表达式是延迟的,所以当db.Order的Item中有任何空值时,除非你处于foreach循环中,否则你找不到它们.

您可以通过添加ToList()调用来查看正在发生的事情:

var orders = db.Order.Where(order => order.Item.Any()).ToList();

现在异常将在循环之前抛出.

您可以通过在Where条件中添加显式空值检查或使用新的?来解决此问题. C#6的语法:

var orders = db.Order.Where(order => order.Item != null && order.Item.Any());

要么

var orders = db.Order.Where(order => order?.Item.Any());

order.Item.Count == 0错误可能具有相同的性质:因为Any()的检查是在DB级别完成的,而First()的调用是在稍后的某个时间发生的,所以可能是那个项目当你打电话给First()时,Any()成功的地方已经消失了.

您应该可以通过为Item添加LoadWith选项来解决此问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读