0

我有一个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"]))
     {
4

1 回答 1

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
}

否则,我看不出您的代码有什么问题。这对我来说可以。

于 2012-08-13T11:23:05.130 回答