我有以下代码:
var query =
from product in products.AsEnumerable()
where product.Field<string>("Product") == "Phone"
select new
{
Name = product.Field<string>("Name"),
ProductNumber = product.Field<string>("ProductNumber"),
ListPrice = product.Field<Decimal>("Price")
};
但是我收到以下错误:
无法将'System.Int32'类型的对象强制转换为'System.String'。
我认为这是因为在ProductNumber
列中我并不总是有字符串,而在第一行ProductNumber
实际上是int
。我已经尝试过转换并将它们转换为字符串,但是没有用。
我该如何解决这个问题?
答案 0 :(得分:1)
来自Field<T>
的文档:
InvalidCastException
[抛出时]基础列的值类型无法强制转换为泛型参数T指定的类型。
在您的情况下,列类型是可以为空的整数,因此您需要执行以下操作:
var query =
from product in products.AsEnumerable()
where product.Field<string>("Product") == "Phone"
select new
{
Name = product.Field<string>("Name"),
// Below, I am using ""+... idiom for a null-safe ToString
ProductNumber = ""+product.Field<int?>("ProductNumber"),
ListPrice = product.Field<Decimal>("Price")
};
我们的想法是将值检索为int
,但接受数据丢失的数据行。
如果您不介意匿名类的ProductNumber
可以为int
而不是string
,请删除表达式的""+
部分。
答案 1 :(得分:0)
首先,使用ProductNumber作为字符串获取可枚举的记录,然后在Enumerable上将字符串转换为int。