我有一个简单的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_NUM
是 decimal
类型,而AddressALL
上的 UID_NUM
属性是 double
类型。因此,您必须将值转换为必要的目标类型。