提问人:Ethan 提问时间:7/10/2021 最后编辑:James ZEthan 更新时间:7/10/2021 访问量:414
如何修复Enumerable.ToDictionary中发生的ArgumentNullException(或NullReferenceException?(C# ASP.NET MVC)
How to fix an ArgumentNullException (or NullReferenceException?) occurring in Enumerable.ToDictionary? (C# ASP.NET MVC)
问:
我有一个正在发生的异常,但我不太明白它是如何发生的。我将不胜感激有关如何修复它的任何提示,或有关如何更好地理解错误发生原因的建议。
背景信息
- 该错误已记录到我们的错误数据库中,不幸的是,我自己无法重现该错误。
- 此错误发生在 24/7 全天候运行的仪表板应用程序中,并且它每分钟尝试刷新一次数据。因此,此错误在过去几周内多次发生。虽然这并不是一个紧迫的问题,因为仪表板不久后会重新尝试刷新数据,但令我感到困扰的是,我无法修复它。
错误
这是记录的异常消息:查找它,这似乎是由 NullReferenceException 引起的。但是,异常发生在 中,根据文档,它只会引发 ArgumentNullException。因此,我对发生哪个错误、如何发生以及为什么发生感到困惑。Object reference not set to an instance of an object.
Enumerable.ToDictionary()
下面是堆栈跟踪的相关部分。
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,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, 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
我的进度
错误发生在 中,因此我首先查找了 Microsoft 文档中的 Enumerable.ToDictionary,这就是我确定错误是 ArgumentNullException 的方式。如前所述,该消息似乎对应于 NullReferenceException,导致我的困惑。Enumerable.ToDictionary
这基本上是我卡住的地方,因为我无法重现这个问题。正如我所提到的,数据经常更新,所以我的测试可能还没有运行足够长的时间再次遇到它。
我尝试在本地测试时手动添加检查,以查看语句前面的语句生成的任何 OrderDetails 是否为 null,但没有一个是 null。.Select()
.ToDictionary()
我唯一能想到的就是在 and 语句之间添加一个 Where 子句:,但我不相信这会解决问题的根本原因,因为我不完全理解此时的 OrderDetail 如何首先为 null。.Where(orderDetail => orderDetail != null)
.Select()
.ToDictionary()
顶级域名
Enumerable.ToDictionary() 似乎正在生成 ArgumentNullException,但保存到错误数据库的错误消息对应于 NullReferenceException。此外,我不明白用于生成 Dictionary 对象的对象如何在代码中的那个点为 null。
答: 暂无答案
评论
ToDictionary
ArgumentNullException
NullReferenceException
source
null
null
_orderDetails = miiDb.OrderDetails
Object reference not set to an instance of an object
ArgumentNullException
NullReferenceException
null
DbSet
FirstOrDefault
First