【问题标题】:How to convert from decimal to double in Linq to Entity如何在 Linq to Entity 中从十进制转换为双精度
【发布时间】:2017-01-24 13:04:01
【问题描述】:

假设我们有一个表 T,它有两列 A 和 B,分别是 float 和 money 类型。我想编写一个类似于以下 T-SQL 语句的 linq 查询:

Select A, B, A * B as C 
From SomeTable
Where C < 1000

我试着像下面这样投射

var list = (from row in model.Table 
            where ((decimal)row.A) * row.B < 1000 
            select new { A = row.A,
                         B = row.B ,
                         C = ((decimal)row.A) * row.B}
           ).ToList();

但它不允许强制转换操作。它抛出一个异常:

Linq to Entity 查询不支持转换为小数,因为 无法推断所需的精度和比例信息。

我的问题是如何在 Linq 中将双精度转换为十进制?我不想从数据库中获取数据。
更新:
我注意到将小数转换为双倍有效,但反向操作会引发异常。所以,
为什么我们不能将双精度转换为十进制? Sql server 是否也在 t-sql 中执行相同的机制?不影响精度吗?

【问题讨论】:

  • It does not allow cast operation
  • 错误是否与此类似? stackoverflow.com/questions/41802366/…
  • Linq to Entity 查询不支持转换为小数,因为无法推断所需的精度和比例信息。
  • 如果将小数转换为双精度进行计算,是否有效?
  • 它不会在逆向转换中抛出异常。

标签: c# entity-framework linq


【解决方案1】:

浮点数(双精度)和小数之间的区别在于,浮点数是精确的小数。如果你给 float 一个值 10.123,那么它在内部可能有一个值 10.1229999999999,它非常接近 10.123,但不完全是。

精确到小数点 x 的小数点在小数点 x 之前始终是准确的。

您的数据库的设计者认为类型 A 不需要小数精度(或者他只是粗心)。让计算结果比输入参数更精确是没有意义的。

如果您确实需要将结果转换为小数,请将您的公式计算为 float / double,并在 AsEnumerable 之后转换为小数:

(我对你的语法不是很熟悉,所以我会使用扩展方法语法)

var list = model.Table.Where(row => row.A * row.B < 1000)
    .Select(row => new
    {
        A = row.A,
        B = row.B,
    })
    .AsEnumerable()
    .Select(row => new
    {
        A = row.A,
        B = row.B,
        C = (decimal)row.A * (decimal)row.B,
    });

意思:

  • 从我的表中,只取具有这样的值的行 row.A * row.B
  • 从每个选定的行中,选择 A 列和 B 列中的值。
  • 将这两个值传输到本地内存 (= AsEnumerable),
  • 为每个传输的行创建一个具有三个属性的新对象:
    • A 和 B 具有传输的值。
    • C 得到 A 和 B 传输的十进制值的乘积

【讨论】:

  • "或者他只是粗心" 这是真的。 Tnx。
  • 为了效率,我将十进制转换为双精度。
【解决方案2】:

您可以避免 AsEnumerable() 向 Entity 解释您想要多少个小数位数。

var list = (from row in model.Table 
            where ((decimal)row.A) * row.B < 1000 
            select new { A = row.A,
                         B = row.B ,
                         C = (((decimal)((int)row.A)*100))/100) * row.B}
           ).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2022-07-21
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多