LINQ 选择字段类型未知
本文关键字:未知 类型 字段 选择 LINQ | 更新日期: 2023-09-27 18:30:59
我有以下代码:
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
。我尝试将它们转换并转换为字符串,但没有奏效。
我该如何解决这个问题?
来自Field<T>
的文档:
当基础列的值类型无法强制转换为泛型参数 T 指定的类型时,将引发
InvalidCastException
[。
看起来在您的情况下,列类型是一个可为空的整数,因此您需要执行以下操作:
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
s 而不是 string
s,请删除表达式的""+
部分。
首先,您将以 ProductNumber 作为字符串获取可枚举的记录,然后在 Enumerable 上从字符串转换为 int。