0

私のプロジェクトには、2つのデータセットdsNamesとがありdsDetailsます。

SQLについては知りません。ここでは、XMLとテキストファイルに接続しています。

dtNames

EmployeeName    EmployeeRole

   a                2
   b                3
   c                4

dtDetails

 Empid     EmployeeName   EmpCity   EmployeeRole

  101        a             abc          3  //EmpRole not equal to above table EmpRole
  102        b             abc          3
  103        c             xyz          4
  104        d             pqr          5
  105        e             rst          6

EmployeeNameand EmployeeRole(ここではと比較)に基づいてこれら2つのデータセットを関連付けdsNames、結果を別のDataSet dsMain(からのテーブル)に格納してから、 anddsDetailsのような比較に従って2つのdataSetを分割します。matchedDataTableunmatchedDataTable

これはDataRelationまたはRowFilterを使用して実行できることは知っていますが、他のデータテーブルと比較する2つの列があるため、これを実行する方法を考えることができません。(私は.netの初心者です)

私は以下のコードを試しました:(動作していません

            foreach (DataRow rwMain in dsNames.Tables[0].Rows)
            {
                foreach (DataRow rwSub in dsDetails.Tables[0].Rows)
                {
                    if (rwMain["EmployeeName"].Equals(rwSub["EmployeeName"]))
                    {
                        if (rwMain["EmployeeRole"].Equals(rwSub["EmployeeRole"]))
                        {
                            // Matched DataTable
                        }
                        else
                        {
                            //Unmatched DataTable
                        }
                    }
                }
            }

私は上記のコードで何か間違ったことをしています、そしてまた私はそれを正しい方法でやっていないようです。

私はそれを知っていますが、私のプロジェクトでは使用できませんので、linqを使用しないでください。

手伝ってください。

4

2 に答える 2

1

LINQを使用できます。両方のテーブルを結合するだけです。一度EmpNameだけ、そして両方の列で一度。

var sameRoleNames = from rn in dtNames.AsEnumerable()
                join rd in dtDetails.AsEnumerable()
                on new
                {
                    Name = rn.Field<string>("EmpName"),
                    Role = rn.Field<string>("EmpRole"),
                } equals new
                {
                    Name = rd.Field<string>("EmpName"),
                    Role = rd.Field<string>("EmpRole"),
                }
                select rd;
var notSameRoleNames = from rn in dtNames.AsEnumerable()
                   join rd in dtDetails.AsEnumerable()
                   on rn.Field<string>("EmpName") equals rd.Field<string>("EmpName")
                   where rn.Field<string>("EmpRole") != rd.Field<string>("EmpRole")
                   select rd;
var matchedDataTable = sameRoleNames.CopyToDataTable();
var unmatchedDataTable = notSameRoleNames.CopyToDataTable();

「Linqを使用できますか」という質問に対するあなたの回答を見たばかりです。とにかくそのままにしておきます、多分それは他の誰かのために役立つでしょう。

于 2012-10-19T09:04:30.780 に答える
0

Selectプロパティを使用して解決しました

 DataRow[] matchedRows = dtNames.Select("EmployeeName = '" + dsDetails.Tables[0].Columns[0].ToString() + "'"
                    + " AND " + " EmployeeRole ='" + dsDetails.Tables[0].Columns[1].ToString() + "'");
                //
 DataRow[] mismatchedRows = dsDetails.Tables[0].Select("EmployeeName <> '" + dtNames.Columns[0].ToString() + "'"
                    + " OR" + " EmployeeRole <>'" + dtNames.Columns[1].ToString() + "'");
于 2012-10-19T12:49:42.037 に答える