Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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

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
C# 循环抛出异常无法将Null强制转换为字符串_C#_Linq - Fatal编程技术网

C# 循环抛出异常无法将Null强制转换为字符串

C# 循环抛出异常无法将Null强制转换为字符串,c#,linq,C#,Linq,我在我继承的代码中对这一点进行了删节,事实证明它是Linq,而我以前从未使用过Linq。我看过一些例子,但我想这不是100%Linq问题,但也许是 我有一个结构: var categories=dtResults.AsEnumerable.Selectr=>r[Cat].Distinct.ToList 这将400个类别指示符重新命名为字符串。dtResults是一个从查询中获取数据的数据表 接下来,我循环遍历这些类别,在第一次迭代中,我得到了一个无法将“System.DBNull”类型的对象转换

我在我继承的代码中对这一点进行了删节,事实证明它是Linq,而我以前从未使用过Linq。我看过一些例子,但我想这不是100%Linq问题,但也许是

我有一个结构:

var categories=dtResults.AsEnumerable.Selectr=>r[Cat].Distinct.ToList

这将400个类别指示符重新命名为字符串。dtResults是一个从查询中获取数据的数据表

接下来,我循环遍历这些类别,在第一次迭代中,我得到了一个无法将“System.DBNull”类型的对象转换为“System.String”类型的对象。错误,因为索引0处的类别在类别中的S循环:foreachstring类别中为空

我不能改变数据,但我可以插入一个空白,但我该怎么做呢

更新 @flup请求的循环:

foreach (string category in categories)
    {
        for (int i = 0; i < WucEntries2.Length; i++)
        {
            drOutput = dtOutput.NewRow();
            drOutput["Category"] = category;
            drOutput["SubCategory "] = subCategories[i];

            drResults = dtResults.Select(String.Format("Category = '{0}' AND SubCategory = '{1}'", category, subCategories[i]));
            if (drResults.Length > 0)
            {
                foreach (DataColumn column in dtResults.Columns)
                {
                    drOutput[column.ColumnName] = drResults[0][column.ColumnName];
                }
            }
            dtOutput.Rows.Add(drOutput);
        }
也许你可以试试:

var categories = dtResults.AsEnumerable().Select(r => Convert.ToString(r["Cat"]))
                                         .Distinct()
                                         .ToList();
希望这会有所帮助

您不能将DBNull强制转换为字符串,但您可以将null强制转换为字符串,因此可能:

var categories = dtResults.AsEnumerable()
    .Select(r => r["Cat"] == DBNull.Value ? (string)null : r["Cat"].ToString())
    .Distinct()
    .ToList();

这也会使您的列表成为一个列表,而不是列表。

我们可以看到循环吗,特别是用于迭代的变量类型?它是一个变量还是一个字符串?根据您的请求添加了循环。这是我在测试时发现的另一个问题。子类别的数据超过了列宽,并引发MaxLimit冲突。由于类别可以为null,因此在类别中写入foreach var类别更安全。这解决了问题吗?这个版本起作用了,但是需求发生了变化,当类别为空时,我将跳过所有记录,因此在我的foreach循环之前将其删除。谢谢你的意见。我想我最好开始认真对待Linq…这一直抛出相同的异常,Joe的版本在下面起作用。谢谢你的意见。