2012-08-13 31 views
0

我有一個從數據庫填充如下一個DataTableLINQ語句只在一個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查詢中犯了一個錯誤,但對我來說似乎很好。

任何人都可以闡明什麼可能是問題?

非常感謝。

UPDATE

剛剛意識到我正在錯誤,爲什麼內環只有一個值。這是因爲它正在做參考比較,而不是DataTable的'SPName'列上的值比較。

將內循環的代碼更改爲以下固定的問題,但我會保留GroupBy版本,因爲我更喜歡它!

foreach (string procedureText in procedureData.Tables[0].AsEnumerable() 
     .Where(dr => dr["SPName"].ToString() == row.Procedure.ToString()) 
     .Select(dr => dr["text"])) 
    { 
+1

如果在外部'foreach'中使用'GroupBy'而不是'Select' /'Distinct',會發生什麼? – Rawling 2012-08-13 11:16:56

回答

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 
} 

否則,我看不出有什麼不對您的代碼。這對我來說可以。

+0

完美!非常感謝,我爲什麼不首先使用它,我不知道...可能與星期一有關! – XN16 2012-08-13 11:30:20

相關問題