LINQ语句仅在存在多个的DataTable上产生一个结果

时间:2012-08-13 11:12:50

标签: c# linq

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

1 个答案:

答案 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
}

否则,我看不出你的代码有什么问题。它对我来说很好。