数值不适合System.Decimal

时间:2016-04-14 07:59:36

标签: c# entity-framework linq postgresql precision

我正在使用带有Entity Framework的Postgres数据库。

在我的数据库中,有一个表格,其中包含In [63]: obj = MyObj() In [64]: session.add(obj) In [65]: session.flush() In [66]: obj.__dict__ Out[66]: {'id': 2, '_sa_instance_state': <sqlalchemy.orm.state.InstanceState at 0x7fe6f380cac8>} In [67]: cached = pickle.dumps(obj) In [68]: session.commit() In [69]: obj2 = session.merge(pickle.loads(cached), load=False) In [70]: obj2 in session Out[70]: True 列,其值为price (numeric)

当我使用LINQ查询获取数据时,它会抛出错误:

  

mscorlib.dll中发生了'System.OverflowException'类型的异常,但未在用户代码中处理

     

其他信息:数字值不适合System.Decimal

在我的模型类中,12314.0464314894136514658489431486146548属性的数据类型为price

我认为DB表中的值具有更高的精度,而我的模型属性精度较低,

所以我的问题是:有没有办法从数据库表中获取具有截断/舍入值的数据,这将适合我的模型属性?

注意:我不能对数据库进行任何更改,我只需要在C#代码中进行更改。

提前致谢

4 个答案:

答案 0 :(得分:1)

您可以对数据库级别的Price字段值进行舍入。试试这个

var myRecords = model.Database
.SqlQuery<MyRecord>("select ..., cast(Price as numeric(19,4)) from mytable");

答案 1 :(得分:0)

如果您收到的值为文本,并且您需要四位小数,则可以像这样进行转换:

decimal d = 0;
d = Convert.ToDecimal(Math.Round(Convert.ToDouble("12314.0464314894136514658489431486146548"), 4));

// d -> 12314.0464

答案 2 :(得分:0)

.edmx文件中添加Select查询,解决我的精确问题。

导航至<EntitySet>标记,然后添加选择查询。

<edmx:StorageModels>
    <Schema>
        <EntityContainer>
            <EntitySet Name="books" EntityType="Self.books" store:Type="Tables" store:Schema="public">
                <DefiningQuery>SELECT "books"."name", (("books"."price")::double precision)::numeric FROM "public"."books" AS "books"</DefiningQuery>
            </EntitySet>
        </EntityContainer>
    </Schema>
</edmx:StorageModels>

现在当我选择该列时,使用下面的查询,它会返回适合c#的十进制数据类型的值,不需要在数据库中进行任何更改。

var result = context.books.Where(x => x.name == "My Book").ToList();

答案 3 :(得分:-1)

尝试一下:

select round(price,4) from books