【问题标题】:divide dataset in to matched and unmatched datatables将数据集划分为匹配和不匹配的数据表
【发布时间】:2012-10-09 20:29:35
【问题描述】:

在我的项目中有两个数据集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 进行比较)并将结果存储在另一个DataSet dsMain(来自dsDetails 的表)中,然后将两者相除数据集根据matchedDataTableunmatchedDataTable等比较。

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

请帮忙。

【问题讨论】:

  • 我知道 linq,但我的项目是严格的非 linq
  • 数据集中有rowfilter、select、datarelation等方法。但我对他们很陌生。所以我不知道如何关联和显示这两个数据表关系。

标签: c# datatable dataset


【解决方案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”问题的回答。反正我把它留在那里,也许它对其他人有帮助。

【讨论】:

    【解决方案2】:

    我通过使用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() + "'");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 2012-03-26
      • 2021-10-31
      • 2014-12-20
      • 2022-01-13
      相关资源
      最近更新 更多