0

在我的项目中有两个数据集dsNamesdsDetails.

我不知道SQL。在这里,我连接到 XML 和文本文件。

名称

EmployeeName    EmployeeRole

   a                2
   b                3
   c                4

dt详情

 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(这里比较dsNames)并将结果存储在另一个 DataSet dsMain(表来自dsDetails)中,然后根据比较像matchedDataTableand划分两个数据集unmatchedDataTable

我知道这可以使用DataRelationRowFilter来完成,但我不知道如何做到这一点,因为有两列要与我不知道的其他数据表两列进行比较。(我是 .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 回答