Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel LINQ操作创建强制转换异常_Excel_Linq_C# 4.0_Datatable - Fatal编程技术网

Excel LINQ操作创建强制转换异常

Excel LINQ操作创建强制转换异常,excel,linq,c#-4.0,datatable,Excel,Linq,C# 4.0,Datatable,从excel文件中读取由填充的数据表中的数据时,获取“无法将类型为'System.Double'的对象强制转换为类型为'System.String'。列数据类型为Double时出现异常。我的代码如下所示 var importedProducts = dtImportedData.AsEnumerable() .Where(dtProduct => !string.IsNullOrWhiteSpace(dtProduct.Field<s

从excel文件中读取由填充的数据表中的数据时,获取“无法将类型为'System.Double'的对象强制转换为类型为'System.String'。列数据类型为Double时出现异常。我的代码如下所示

 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();
var importedProducts=dtImportedData.AsEnumerable()
.Where(dtProduct=>!string.IsNullOrWhiteSpace(dtProduct.Field(“产品id”))
.选择(dtProduct=>new
{
product_id=dtProduct.Field(“product_id”).Trim(),
产品数量=转换为32(dtProduct.Field(“产品数量”))
}).ToList();
当product_id列具有文本数据类型时,一切正常。但当存在双数据类型时,它会引发异常


我已经尝试了中的解决方案,如果
产品id
是一个双精度而不是字符串,那么为什么要将其转换为
字符串

.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")
 })
如果您不知道
DataTable
DataColumn
的类型,可以在调试器中执行以下操作:

dtImportedData.Columns["product_id"].DataType;
这是您必须在
字段中使用的内容


如果类型确实如注释所示发生变化,则这是最安全的:

.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())
 })

那么,如果
product\u id
是一个double而不是字符串,那么为什么要将其转换为
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")
 })
如果您不知道
DataTable
DataColumn
的类型,可以在调试器中执行以下操作:

dtImportedData.Columns["product_id"].DataType;
这是您必须在
字段中使用的内容


如果类型确实如注释所示发生变化,则这是最安全的:

.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())
 })

你有一个专栏可以神奇地把它的类型改成另一种类型?@Steve,你说得对。用户根据自己的意愿更改excel列数据类型,我们无法控制它。从逻辑上讲,您不应该使用相同的代码读取不同的数据类型。因此,您有一个列可以神奇地将其类型更改为另一种类型?@Steve,您是对的。用户根据自己的意愿更改excel列数据类型,我们无法控制它。从逻辑上讲,您不应该使用相同的代码来读取不同的数据类型。Tim Schmelter,product_id数据类型为string。但我正在从excel文件填充dtImportedData变量,用户不断更改excel列数据类型。@user1926138:我不明白,它是字符串还是双精度,还是在更改,是什么?你看到我在答案末尾的提示了吗?它在变化。用户可以使用excel工作表中的任何数据类型,我需要将其转换为字符串。@user1926138:添加了另一种方法Tim Schmelter,product_id数据类型为字符串。但我正在从excel文件填充dtImportedData变量,用户不断更改excel列数据类型。@user1926138:我不明白,它是字符串还是双精度,还是在更改,是什么?你看到我在答案末尾的提示了吗?它在变化。用户可以使用excel工作表中的任何数据类型,我需要将其转换为字符串。@user1926138:添加了另一种方法