Numeric NaN not supported by System.Decimal
От: Lev_Limin  
Дата: 05.04.21 18:54
Оценка:
Есть у меня класс замапленный на таблицу Postgresql

class Layer
{
    // ...
    [Column("area")]
    public double Area {get; set;}
    // ...
}


Замапленное поле имеет тип Numeric. В это поле кладётся триггером значение функции
st_area(geom)

.
Где geom это тип Postgis, расширения для Postgresql.
Иногда, когда геометрия кривая, то результат этой функции может быть NaN.
И соответственно, пытаясь в LinqToDb получить значение записи, получаю ошибку: "Numeric NaN not supported by System.Decimal"
Можно как-то такие вещи отслеживать или надо логику работы поменять, что бы не приходилось запрашивать записи со значением NaN в поле?
Отредактировано 05.04.2021 19:37 Lev_Limin . Предыдущая версия .
Re: Numeric NaN not supported by System.Decimal
От: Mace Windu  
Дата: 06.04.21 09:16
Оценка:
Здравствуйте, Lev_Limin, Вы писали:

Если верно понял ситуацию, то должно быть достаточно в mapping schema зарегистировать кастомную конверсию double -> decimal которая уже эти значение как вам надо обработает.
Re[2]: Numeric NaN not supported by System.Decimal
От: LevLimin Россия  
Дата: 06.04.21 10:57
Оценка:
Здравствуйте, Mace Windu, Вы писали:

MW>Здравствуйте, Lev_Limin, Вы писали:


MW>Если верно понял ситуацию, то должно быть достаточно в mapping schema зарегистировать кастомную конверсию double -> decimal которая уже эти значение как вам надо обработает.


Как я понял ситуацию, сначала npgsql пытается сделать numeric в decimal и уж потом LinqToDb переводит в double, но npgsql обламывается на операции numeric -> decimal
Lev Limin
Re[2]: Numeric NaN not supported by System.Decimal
От: LevLimin Россия  
Дата: 06.04.21 11:58
Оценка:
Здравствуйте, Mace Windu, Вы писали:

MW>Здравствуйте, Lev_Limin, Вы писали:


MW>Если верно понял ситуацию, то должно быть достаточно в mapping schema зарегистировать кастомную конверсию double -> decimal которая уже эти значение как вам надо обработает.


Как я понял ситуацию, сначала npgsql пытается сделать numeric в decimal и уж потом LinqToDb переводит в double, но npgsql обламывается на операции numeric -> decimal
Lev Limin
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...
Пока на собственное сообщение не было ответов, его можно удалить.