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 回目で 2 回、3 回目で 3 回繰り返されると予想します。ただし、内側のループには 1 つの値 (シーケンスの最初の値) しかありません。

私は LINQ を初めて使用するわけではなく、これよりもはるかに複雑なクエリを作成しましたが、これは、内側のループに期待されるすべての結果が得られない理由に本当に困惑しています。2 番目のループの LINQ クエリで間違いを犯したと思いますが、問題ないようです。

問題の原因を特定できる人はいますか?

どうもありがとう。

アップデート

私が犯していた間違いと、内側のループの値が 1 つしかない理由に気付きました。これは、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 に答える