Re[3]: Numeric NaN not supported by System.Decimal
От: Mace Windu  
Дата: 06.04.21 15:30
Оценка: 1 (1)
Здравствуйте, LevLimin, Вы писали:

LL>Как я понял ситуацию, сначала npgsql пытается сделать numeric в decimal и уж потом LinqToDb переводит в double, но npgsql обламывается на операции numeric -> decimal


Ага, глянул документацию, похоже postgresql хранит NaN даже для fixed point чисел (большинство баз и для floating point его не поддерживают). Значит тут надо на уровне DataReader конвертер менять, который в DataProvider настраивается. Одна проблема что я не вижу поддержки этого на уровне npgsql для decimal:

тут ничего похожего не видно
тут как раз поддержка обсуждается


Т.е. по сути я подозреваю сейчас оно падает в npgsql в NpgsqlDataReader.GetDecimal(). Судя по тому что для double npgsql NaN вроде как поддерживает, можно попробовать такой read expression в провайдере выставить:

SetProviderField<IDataReader, double, decimal>((r,i) => r.GetDouble(i));


так как SetProviderField protected, то надо либо наследоваться от PostgreSQLDataProvider либо напрямую добавлять конвертер в ReaderExpressions (оно public).

Если этот вариант не пройдет (Npgsql все равно через decimal вычитать данные будет пытаться), то тогда надо выбирать данные с преобразованием в double на уровне sql уже.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.