我有一个DataTable
从数据库中填充的,如下所示:
SPName SName Row text
p_obj_prod1 dbo 1 A
p_obj_prod1 dbo 1 B
p_obj_prod1 dbo 1 C
p_obj_prod2 dbo 1 D
p_obj_prod2 dbo 1 E
p_rpt_prod3 dbo 1 F
p_rpt_prod3 dbo 1 G
p_rpt_prod3 dbo 1 H
我有以下代码将处理这些数据:
foreach (var row in procedureData.Tables[0].AsEnumerable()
.Select(dr => new { Schema = dr["SName"], Procedure = dr["SPName"] })
.Distinct())
{
//DO STUFF
foreach (string procedureText in procedureData.Tables[0].AsEnumerable()
.Where(dr => dr["SPName"] == row.Procedure).Select(dr => dr["text"]))
{
//DO MORE STUFF
}
//DO EVEN MORE STUFF
}
在这种情况下,我希望外部 foreach 循环迭代 3 次,并且确实如此。我还希望内部 foreach 循环将在第一次外部循环迭代中迭代 3 次,第二次迭代 2 次,第三次迭代 3 次。然而,内部循环只有一个值(序列中的第一个)。
我对 LINQ 并不陌生,并且创建了比这更复杂的查询,但这确实让我很难理解内部循环没有所有预期结果的原因。我想我在第二个循环的 LINQ 查询中犯了一个错误,但对我来说似乎很好。
任何人都可以阐明可能是什么问题吗?
非常感谢。
更新
刚刚意识到我犯的错误以及为什么内部循环只有一个值。这是因为它是在进行参考比较,而不是对 DataTable 的“SPName”列进行值比较。
将内部循环的代码更改为以下代码可以解决问题,但是我会保留GroupBy
我喜欢的版本!
foreach (string procedureText in procedureData.Tables[0].AsEnumerable()
.Where(dr => dr["SPName"].ToString() == row.Procedure.ToString())
.Select(dr => dr["text"]))
{