我已经在我继承的代码中对此进行了修改,因为它确实是Linq而我之前没有Linq-ed。我看了一些例子,但我想这不是100%的Linq问题,但也许是。
我有这个结构:
var categories = dtResults.AsEnumerable().Select(r => r["Cat"]).Distinct().ToList();
将一些类别指示符作为字符串重新编写400。 dtResults
是DataTable
,可以从查询中获取数据。
接下来,我遍历categories
并在第一次迭代时遇到Unable to cast object of type 'System.DBNull' to type 'System.String'.
错误,因为索引0处的category
在循环中为空:foreach(string category in categories)
。< / p>
我无法更改数据,但我可以插入空格,但我该怎么做?
更新 @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);
}
答案 0 :(得分:2)
您无法将DBNull
投射到string
,但您可以null
投放到string
,所以可能:
var categories = dtResults.AsEnumerable()
.Select(r => r["Cat"] == DBNull.Value ? (string)null : r["Cat"].ToString())
.Distinct()
.ToList();
这也会使您的列表成为List<string>
而不是List<object>
。
答案 1 :(得分:1)
也许你可以试试:
var categories = dtResults.AsEnumerable().Select(r => Convert.ToString(r["Cat"]))
.Distinct()
.ToList();
希望这会有所帮助