我有一个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"]))
{
答案 0 :(得分:2)
为什么不使用GroupBy
:
var grouped = procedureData.Tables[0]
.AsEnumerable()
.GroupBy(dr=>new
{
Schema = dr["SName"],
Procedure = dr["SPName"]
});
foreach(var g in grouped)
{
//DO STUFF
foreach(string procedureText in g.Select(dr => dr["text"]))
{
//DO MORE STUFF
}
//DO EVEN MORE STUFF
}
否则,我看不出你的代码有什么问题。它对我来说很好。