在LinQ查询中将Double转换为Decimal

时间:2014-01-30 22:02:42

标签: linq silverlight service ria

我在C#中执行LinQ查询,但我收到此错误:

  

System.Data.Entity.dll中出现“System.NotSupportedException”类型的异常,但未在用户代码中处理

     

其他信息:LINQ to不支持强制转换为Decimal   实体查询,因为所需的精度和比例信息   无法推断。

最近我在Lightswitch应用程序中创建了一个RIA服务,我希望得到一个简单的操作。

public class Reporte_HorasporCliente
{
    [Key]
    public int ID { get; set; }
    public string Cliente { get; set; }
    public double HPD { get; set; }
    public double? HPG { get; set; }
    public double? HAP { get; set; }
    public double? HCL { get; set; }
    public double? HEP { get; set; }
    public double? HEJ { get; set; }
    public double? HFT { get; set; }
    public double? HPP { get; set; }
    public double? Saldo { get; set; }
    public decimal? Cumplimiento { get; set; }
    public DateTime FechaOrden { get; set; }
}

public IQueryable<Reporte_HorasporCliente> getReporteHrsCliente()
    {
        var query = from q in this.Context.DetalleOrdenCompras
                    select new Reporte_HorasporCliente
                    {
                        ID = q.Id,
                        Cliente = q.OrdenCompra.Cliente.Nombre,
                        HAP = q.HAP,
                        HCL = q.HCL,
                        HEJ = q.HEJ,
                        HEP = q.HEP,
                        HFT = q.HFT,
                        HPD = q.HPD,
                        HPG = q.HPG,
                        HPP = q.HPD - q.HPG,
                        Saldo = q.HPD - q.HEJ,
                        FechaOrden = q.OrdenCompra.FechaOrden,
                        Cumplimiento = (q.HEJ == 0 ? 0 : ((q.HPD / q.HEJ) * 10) / 100),
                    };
        return query;
    }
  HEJ和HPD是双倍的。

在“Cumplimiento”中我正在做:

Cumplimiento = (decimal)(q.HEJ == 0 ? 0 : ((q.HPD / q.HEJ) * 10) / 100),
Cumplimiento = Convert.ToDecimal((q.HEJ == 0 ? 0 : ((q.HPD / q.HEJ) * 10) / 100)),
Cumplimiento = (q.HEJ == 0 ? 0 : (((decimal)q.HPD / (decimal)q.HEJ) * 10) / 100),

Whitout任何结果,我真的需要一些帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

抱歉复活旧帖子。我在这里通过谷歌结束了,并希望至少给出一个有效的答案。

正如其他人所指出的那样,这通常是一个坏主意,你不应该盲目地在双倍和小数之间施放。要实际执行此操作,您需要首先将数据放入内存,因为无法在sql中完成转换。

public IQueryable<Reporte_HorasporCliente> getReporteHrsCliente()
    {
        var query = (from q in this.Context.DetalleOrdenCompras
                    select new
                    {
                        ID = q.Id,
                        Cliente = q.OrdenCompra.Cliente.Nombre,
                        HAP = q.HAP,
                        HCL = q.HCL,
                        HEJ = q.HEJ,
                        HEP = q.HEP,
                        HFT = q.HFT,
                        HPD = q.HPD,
                        HPG = q.HPG,
                        HPP = q.HPD - q.HPG,
                        Saldo = q.HPD - q.HEJ,
                        FechaOrden = q.OrdenCompra.FechaOrden,
                      }).ToList()
                      .Select(q => new Reporte_HorasporCliente 
                                   {
                        ID = q.ID,
                        Cliente = q.Cliente,
                        HAP = q.HAP,
                        HCL = q.HCL,
                        HEJ = q.HEJ,
                        HEP = q.HEP,
                        HFT = q.HFT,
                        HPD = q.HPD,
                        HPG = q.HPG,
                        HPP = q.HPP,
                        Saldo = q.Saldo,
                        FechaOrden = q.FechaOrden,
                        Cumplimiento = (decimal)((q.HEJ == 0 ? 0 : ((q.HPD / q.HEJ) * 10) / 100)),
                 });
        return query;
    }

答案 1 :(得分:-1)

double值无法自动转换为十进制。在使用十进制变量中的double值时显式使用Convert.ToDecimal()方法。您应该按如下方式更新代码:

  var query = from q in this.Context.DetalleOrdenCompras
                select new Reporte_HorasporCliente
                {
                    ID = q.Id,
                    Cliente = q.OrdenCompra.Cliente.Nombre,
                    HAP = q.HAP,
                    HCL = q.HCL,
                    HEJ = q.HEJ,
                    HEP = q.HEP,
                    HFT = q.HFT,
                    HPD = q.HPD,
                    HPG = q.HPG,
                    HPP = q.HPD - q.HPG,
                    Saldo = q.HPD - q.HEJ,
                    FechaOrden = q.OrdenCompra.FechaOrden,
                    Cumplimiento = Convert.ToDecimal( (q.HEJ == 0 ? 0 : ((q.HPD / q.HEJ) * 10) / 100)),
                };
    return query;