微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修复 Enumerable.ToDictionary 中发生的 ArgumentNullException或 NullReferenceException?? (C# ASP.NET MVC)

如何解决如何修复 Enumerable.ToDictionary 中发生的 ArgumentNullException或 NullReferenceException?? (C# ASP.NET MVC)

我有一个正在发生的异常,但我不太明白它是如何发生的。我将不胜感激任何有关如何修复它的提示,或有关如何更好地理解错误发生原因的建议。

背景信息

  • 错误已记录到我们的错误数据库中,很遗憾,我自己无法重现该错误
  • 错误发生在一个 24/7 全天候运行的仪表板应用程序中,它尝试每分钟刷新一次数据。因此,此错误在过去几周内多次发生。虽然这并不是一个紧迫的问题,因为仪表板很快就会重新尝试刷新数据,但我一直无法修复它让我感到困扰。

错误

这是记录的异常消息:Object reference not set to an instance of an object. 查了一下,这似乎是由 NullReferenceException 引起的。但是,异常发生在 Enumerable.ToDictionary() 中,根据文档,它只会抛出 ArgumentNullException。因此,我对正在发生的错误、发生的方式和原因感到困惑。

这是堆栈跟踪的相关部分。

   at PackerVM.<>c.<GetData>b__32_3(OrderDetail orderDetail) in PackerVM.cs:line 72
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source,Func`2 keySelector,Func`2 elementSelector,IEqualityComparer`1 comparer)
   at System.Linq.Enumerable.ToDictionary[TSource,Func`2 elementSelector)
   at PackerVM.GetData() in PackerVM.cs:line 65

代码

这是发生错误代码

_orderDetails = miiDb.OrderDetails  // OrderDetails is a DbSet<OrderDetail>
    .Where(orderDetail => orderDetail.Department == "MOLDING" && orderDetail.Location != null)
    .GroupBy(orderDetail => orderDetail.Location)
    .Select(orderDetails => orderDetails.OrderByDescending(w => w.ReleaseState)
        .ThenBy(orderDetail => orderDetail.Sequence)
        .ThenBy(orderDetail => orderDetail.PlannedStart)
        .FirstOrDefault())
    .ToDictionary(orderDetail => orderDetail.Location,orderDetail => new PackerPressData()
    {
        Location = orderDetail.Location,Machinestatus = orderDetail.Machinestatus,ReleaseState = orderDetail.ReleaseState,Tool = orderDetail.Tool,PartNumber = orderDetail.PartNumber
    });

这里是堆栈跟踪中行号的一些额外细节:

第 72 行引用了这部分代码.ToDictionary(orderDetail => orderDetail.Location,orderDetail => new PackerPressData()

第 65 行引用了这部分代码_orderDetails = miiDb.OrderDetails

我的进步

错误发生在 Enumerable.ToDictionary,所以我首先查找 Microsoft docs for Enumerable.ToDictionary,这就是我确定错误是 ArgumentNullException 的方式。如前所述,该消息似乎对应于 NullReferenceException,导致我感到困惑。

这基本上是我卡住的地方,因为我无法重现该问题。正如我所提到的,数据经常更新,所以我的测试可能运行时间不够长,无法再次遇到它。

我尝试在本地测试时手动添加检查,以查看 .Select() 语句之前的 .ToDictionary() 语句生成的任何 OrderDetails 是否为空,但没有为空。

我唯一能想到的是在 .Where(orderDetail => orderDetail != null).Select() 语句之间添加一个 Where 子句:.ToDictionary(),但我不相信这会解决问题的根本原因,因为我不完全理解此时的 OrderDetail 是如何首先为 null 的。

TLDR

Enumerable.ToDictionary() 似乎产生了 ArgumentNullException,但保存到我们的 Error 数据库错误消息对应于 NullReferenceException。此外,我不明白在代码中用于生成 Dictionary 对象的对象如何可以为 null。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。