在Linq中乘以十进制和双精度

时间:2017-09-05 04:04:43

标签: c# entity-framework linq

如果我有一个poco类

public class Entry
{
    public double Quantity { get; set; }
    public decimal Cost{ get; set; }
}

如何使用类似

的Linq查询对它们进行算术运算
context.Entries.Sum(e => (decimal)e.Quantity * e.Cost);

我无法将类型为'System.Double'的对象强制转换为'System.Decimal'

编辑:我已将十进制转换为双精度并且有效。

context.Entries.Sum(e => e.Quantity * (double)e.Cost);

3 个答案:

答案 0 :(得分:3)

实体框架表明它不支持您想要的转换。要获取原始查询,您可以进行以下更改:

context.Entries
.AsEnumerable() // perform rest of work in memory
.Sum(e => (decimal)e.Quantity * e.Cost);

答案 1 :(得分:0)

您可以使用Convert.ToDecimal()

context.Entries.Sum(d => Convert.ToDecimal(d.Quantity)*d.Cost)

Here is working fiddle

根据Tetsuya Yamamoto的说明进行编辑,如果您没有使用可录制的收藏品

context.Entries.ToList().Sum(d => Convert.ToDecimal(d.Quantity)*d.Cost)

答案 2 :(得分:0)

如果你坚持在数据库端执行所有计算并且你在使用转换时遇到问题,你可以使用SqlFunctions类的静态方法,但当然它会有性能开销:

var result = context.Entries
     .Sum(x => SqlFunctions.Exp(SqlFunctions.Log(x.Quantity) + SqlFunctions.Log(x.Cost)));
  

说明:e ^(ln(数量)+ ln(成本))= e ^(ln(数量*成本))=数量*   成本

或者您可以尝试手动编写查询:

var result = context.Database
     .SqlQuery<decimal>("select sum(Quantity * Cost) from dbo.Entries)").FirstOrDefault();