DateTime 和 DBNull 值混合的 OrderBy 抛出错误

OrderBy on mix of DateTime and DBNull values throws error

我想订购我的 'SortObject' class 的清单。此 class 旨在通过保存组织在字典(名为 'Cells')中的任意数据来模仿 DataGrid 行,其中键类似于 DataGrid 列。强制任何给定键仅与一种数据类型相关联,例如键 "Name" 将仅具有字符串类型的值。

我的代码(下方)实际上适用于我使用过的大多数情况:

// public Dictionary<string, object> Cells { get; set; } <-- relevant field from 'SortObject'

List<SortObject> sortObjects = GetSortObjects(); // This is simplified, the data has a few different sources
IOrderedEnumerable<SortObject> orderedList = sortObjects.OrderBy(p => p.Cells["ArbitraryKey"]);
SortObject firstObject = sortedList.First();

// other work with 'orderedList' follows

当我尝试对 DateTime 类型的 OrderBy 对象进行排序时出现问题其中一些对象未设置并且默认为 'System.DBNull'。在这种情况下,当调用 'sortedList.First()' 或以后对 'sortedList' 的任何引用时都会抛出异常。异常很简单:“对象必须是 DateTime 类型”,这似乎是 OrderBy 试图将 DateTime 类型与 DBNull 类型进行比较的结果。

我已经尝试了两个目前还没有奏效的解决方案:

尝试一:将 DBNull 设置为新的 DateTime。理论上这应该可行,但我需要创建的不仅仅是 DateTime 类型的对象,还需要动态创建任意类型的对象。 (我还需要注意这些 SortObjects,并在我的顺序正确后将它们的数据设置回 DBNull;毕竟我不能真正更改数据)。

尝试二:只组织 DBNull,然后组织 DateTime,然后将它们组合在一起。同样,这在理论上可能可行,但代码片段中提到的 "other work" 范围很广,包括使用 ThenBy() 在任何键上任意次数地重新排序。将其复杂性加倍不是一个优雅的解决方案,我认为它是一个备份。

解决此问题的最佳方法是什么?

PS:OrderBy and DateTime 我使用的是 Microsoft .NET Framework v4.6.2

将 OrderBy 语句更改为 OrderBy(v => v is DBNull ? null : v)

OrderBy 可以处理空值,但不能处理 dbNulls。

该代码应该适用于所有数据类型