linq选择字段类型未知

时间:2013-09-12 10:13:49

标签: c# linq

我有以下代码:

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。我已经尝试过转换并将它们转换为字符串,但是没有用。

我该如何解决这个问题?

2 个答案:

答案 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。