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。我尝试将它们转换并转换为字符串,但没有奏效。

我该如何解决这个问题?

LINQ 选择字段类型未知

来自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。