将数据集划分为匹配和不匹配的数据表

时间:2012-10-19 08:51:07

标签: c# datatable dataset

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

我不了解SQL。这里我连接到XML和Textfiles。

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

我希望根据EmployeeNameEmployeeRole(此处与dsNames进行比较)将这两个数据集关联起来,并将结果存储在另一个DataSet dsMain中(来自{ {1}})然后根据dsDetailsmatchedDataTable之类的比较划分两个数据集。

我知道这可以使用DataRelationRowFilter完成,但我无法想到如何做到这一点,因为有两列要与其他数据表两列进行比较,我不知道。(我是初学者.net)

我尝试了以下代码:(无法正常工作

unmatchedDataTable

我在上面的代码中做错了,看起来我并没有以正确的方式做到这一点。

请不要linq,因为我知道但我不能在我的项目中使用它。

请协助。

2 个答案:

答案 0 :(得分: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”问题的回答。无论如何,我把它留在那里,也许这对其他人有帮助。

答案 1 :(得分: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() + "'");