我正在使用带有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#代码中进行更改。
提前致谢
答案 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