Есть у меня класс замапленный на таблицу 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 в поле?
Если верно понял ситуацию, то должно быть достаточно в mapping schema зарегистировать кастомную конверсию double -> decimal которая уже эти значение как вам надо обработает.
Re[2]: Numeric NaN not supported by System.Decimal
Здравствуйте, 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
Здравствуйте, 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
Здравствуйте, 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 protected, то надо либо наследоваться от PostgreSQLDataProvider либо напрямую добавлять конвертер в ReaderExpressions (оно public).
Если этот вариант не пройдет (Npgsql все равно через decimal вычитать данные будет пытаться), то тогда надо выбирать данные с преобразованием в double на уровне sql уже.