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选项来解决此问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |