LINQ操作创build转换exception

当从Excel文件中填充的数据表中读取数据时,得到“无法将types为”System.Double“的对象转换为键入”System.String“。 当列数据types是双倍时exception。 我的代码如下所示

var importedProducts = dtImportedData.AsEnumerable() .Where(dtProduct => !string.IsNullOrWhiteSpace(dtProduct.Field<string>("product_id"))) .Select(dtProduct => new { product_id = dtProduct.Field<string>("product_id").Trim(), product_qty = Convert.ToInt32(dtProduct.Field<double>("product_qty ")) }).ToList(); 

当product_id列有文本数据types时,一切正常。 但是,如果有双数据types,则抛出exception。

我已经尝试从这里解决

那么,如果product_id是一个double而不是一个string,为什么你把它放在string呢?

 .Where(row => !string.IsNullOrWhiteSpace(row.Field<double>("product_id").ToString())) .Select(row => new { product_id = row.Field<double>("product_id"), product_qty = (int)row.Field<double>("product_qty") }) 

我不喜欢!string.IsNullOrWhiteSpace方法与包含doubledouble?字段double? 。 我很确定你可以使用(被testing):

 .Where(row => row.Field<double?>("product_id").HasValue) .Select(row => new { product_id = row.Field<double?>("product_id").Value, product_qty = (int)row.Field<double>("product_qty") }) 

如果您不知道DataTable DataColumn的types,则可以在debugging器中执行此操作:

 dtImportedData.Columns["product_id"].DataType; 

这是你必须在Field<T>


如果types真的改变,如下所示:这是最安全的:

 .Where(row => !string.IsNullOrWhiteSpace(row["product_id"].ToString())) .Select(row => new { product_id = row["product_id"].ToString().Trim(), product_qty = int.Parse(row["product_qty"].ToString().Trim()) })