首页 / C# / c# – LINQ任何失败?
c# – LINQ任何失败?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – LINQ任何失败?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1336字,纯文字阅读大概需要2分钟。
内容图文
![c# – LINQ任何失败?](/upload/InfoBanner/zyjiaocheng/762/4aae3cc7cfdd4d0b941bb6388943ebe6.jpg)
是否有任何理由为什么以下代码中的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选项来解决此问题.
内容总结
以上是互联网集市为您收集整理的c# – LINQ任何失败?全部内容,希望文章能够帮你解决c# – LINQ任何失败?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。