OrderBy при сочетании значений DateTime и DBNull вызывает ошибку - PullRequest
0 голосов
/ 29 мая 2020

Я хочу заказать список моего класса «SortObject». Этот класс предназначен для имитации строки DataGrid путем хранения произвольных данных, организованных в словаре (с именем «Cells»), где ключ аналогичен столбцу DataGrid. Принудительно, что любой заданный ключ связан только с одним типом данных, например, ключ «Name» будет иметь только значения типа String.

Мой код (ниже) действительно работает в большинстве случаев Я использовал:

// 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

Проблема возникает, когда я пытаюсь использовать объекты OrderBy типа DateTime, и , некоторые из этих объектов не установлены и по умолчанию - System.DBNull. В этом случае возникает исключение при вызове sortedList.First () или в любой из последующих ссылок на sortedList. Исключение простое: « Объект должен иметь тип DateTime », что, похоже, является следствием попытки OrderBy сравнить тип DateTime с типом DBNull.

Я пробовал два решения, которые до сих пор не работали:

Попытка первая: установите для DBNull значение new DateTime. Теоретически это должно работать, но мне нужно будет создавать не просто объекты типа DateTime, а объекты любого произвольного типа на лету. (Мне также нужно было бы принять к сведению эти SortObjects и вернуть их данные в DBNull, как только я установил правильный порядок; в конце концов, я не могу фактически изменять данные).

Попытка вторая: организовать только DBNull , затем просто DateTime, а затем сложите их вместе. Опять же, это может работать теоретически, но «другая работа», упомянутая в фрагменте кода, обширна, включая переупорядочение с помощью ThenBy () произвольное количество раз для любого ключа (ключей). Удвоение сложности - не изящное решение, и я считаю это резервным копированием.

Как лучше всего решить эту проблему?

PS: Для OrderBy и DateTime Я использую Microsoft. NET Framework v4.6.2

1 Ответ

1 голос
/ 29 мая 2020

Измените оператор OrderBy на OrderBy(v => v is DBNull ? null : v)

OrderBy может обрабатывать значения NULL, но не dbNulls.

Этот код должен работать для всех типов данных

...