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
方法与包含double
或double?
字段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()) })