【问题标题】:cannot convert type decimal to double无法将类型十进制转换为双精度
【发布时间】:2016-12-31 15:36:45
【问题描述】:

我有一个通过实体框架调用 sql 视图表的简单 Web 服务。我可以把字符串中的所有列都很好,但不能把数字中的列,比如 SQL 中的 UID_NUM(numeric(38,8), null)。我有 AddressALL 类来设置如下所示的列,并在 LINQ 中的 p.UID_NUM 处出错。

public class GISAddressWebService : System.Web.Services.WebService
{
     [WebMethod]
     public AddressALL[] getAddress()
     {
         try
         {
             List<view_COBADDRESS> address = new List<view_COBADDRESS>();
             using (GISAddressEntities database = new GISAddressEntities())
             {
                 return database.view_COBADDRESS
                        .Where(p => p.UNIT_NUM == "103")
                        .Select(p => new AddressALL { UID_NUM = p.UID_NUM, ADD_FULL = p.ADD_FULL, POSTALCITY = p.POSTALCITY, ZIP5 = p.ZIP5}).ToArray();
             }
         }
         catch (Exception)
         {
             return null;
         }
     }
}

public class AddressALL
{
     public double UID_NUM { get; set; }
     public string TLID { get; set; }
     public string ADD_FULL { get; set; }
     public string POSTALCITY { get; set; }
     public string STATE { get; set; }
     public string ZIP5 { get; set; }
     public string IN_OUT { get; set; }

}

【问题讨论】:

  • 为什么不使用 (double)p.UID_NUM?
  • 谢谢杰罗恩。它有效!
  • 如果您在回答中发表评论,我会将其标记为已回答。
  • 有没有办法全选而不是列出所有列?
  • 不清楚你想做什么。看看this 网站。或者看看像AutoMapper这样的框架

标签: c# entity-framework linq web-services


【解决方案1】:

小数的有效数字比双精度数多,因此它可以更精确,并且占用的内存略多。由于这种差异,你必须通过 (double)p.UID_NUM 显式编程这种类型的更改。

【讨论】:

  • 有没有办法全选而不是列出所有列?
【解决方案2】:
return database.view_COBADDRESS
                        .Where(p => p.UNIT_NUM == "103")
                        .Select(p => new AddressALL { UID_NUM = System.Convert.ToDouble(p.UID_NUM), ADD_FULL = p.ADD_FULL, POSTALCITY = p.POSTALCITY, ZIP5 = p.ZIP5}).ToArray();

MSDN

【讨论】:

  • 您的代码没有编程错误,但没有返回值。
【解决方案3】:

显而易见的解决方案,而不是

.Select(p => new AddressALL
        {
            UID_NUM = p.UID_NUM,
            ADD_FULL = p.ADD_FULL,
            POSTALCITY = p.POSTALCITY,
            ZIP5 = p.ZIP5
        });

.Select(p => new AddressALL
        {
            UID_NUM = Convert.ToDouble(p.UID_NUM),
            ADD_FULL = p.ADD_FULL,
            POSTALCITY = p.POSTALCITY,
            ZIP5 = p.ZIP5
        });

在您的选择语句.Select(p =&gt; new AddressALL{ ... }) 中,您正在执行projection,它试图为每个p 选择一个AddressALL 类型的新对象,并且您正在使用对象初始化语法{...} 来匹配源对象的属性p 与目标类型的属性AddressALL

但是,您的错误消息表明您的p.UID_NUMdecimal 类型,而AddressALL 上的UID_NUM 属性是double 类型。因此,您必须将值转换为必要的目标类型。

【讨论】:

  • 当我省略 UID_NUM = Convert.ToDouble(p.UID_NUM) 时,它会返回我期望的值,但使用 UID_NUM 时,它只返回任何程序错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多