2012-10-19 39 views
0

在我的项目中有两个数据集dsNamesdsDetails将数据集划分为匹配和不匹配的数据表

我不知道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 

我想涉及基于这两个数据集的EmployeeNameEmployeeRole(这里比较dsNames),结果存储在另一个数据集dsMain(来自dsDetails的表格),然后将这两个数据集分成比较如matchedDataTableunmatchedDataTable。我不知道(我是.net的初学者)。我知道这可以使用DataRelationRowFilter完成,但我不能想到如何做到这一点,因为有两列要与其他数据表两列,我不知道。

我尝试下面的代码:(不工作

  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,因为我知道但我不能在我的项目中使用它。

请协助。

+0

你可以使用LINQ解决它? –

+0

我知道linq,但我的项目是严格的非LINQ –

+0

有一些方法,如rowfilter,选择,datarelation在数据集中。但我对他们是陌生的。所以我不能理解如何关联和显示两个数据关系。 –

回答

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() + "'"); 
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”的问题上看到你的答案。无论如何,我都会留下它,也许这对其他人有帮助。