无法将类型十进制转换为双精度



我有一个简单的Web服务通过实体框架调用sql视图表。我可以很好地处理字符串中的所有列,但不能像 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; }
}

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

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

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

.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 语句中.Select(p => new AddressALL{ ... })您正在执行一个投影,该投影尝试为每个p选取一个类型为 AddressALL 的新对象,并且您正在使用对象初始值设定项语法{...}将源对象的属性p与目标类型AddressALL的属性相匹配。

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

最新更新