【问题标题】:making rows distinct and showing all the columns使行不同并显示所有列
【发布时间】:2012-10-10 18:58:06
【问题描述】:

在我的项目中有两个数据表dtFaildtFaileddtFailed 只有列名声明)。 dtFail 具有重复的“EmployeeName”列值。所以我拿了一个数据视图dvFail 并做了一个使它们不同的过程,如下面的代码所示:

dtFail

我尝试了以下代码:

   DataView dvFail = new DataView(dtFail);
   dtFail = dvFail.ToTable(true, "EmployeeName"); //showing only one column in dtFail

dtFailed只有一列

如果我喜欢下面

   DataView dvFail = new DataView(dtFail);
   dtFail = dvFail.ToTable(true, "EmployeeName","EmployeeRole","Status");

dtFailed显示但有重复行

那么数据表dtFailed 也存储了重复的“EmployeeName”。

请帮忙
提前致谢。

【问题讨论】:

  • 需要更多信息 - 您能否粘贴一些示例数据以显示 dvFail 表中的数据是什么?
  • @SachinShanbhag 检查我编辑的问题

标签: c# datatable dataset dataview


【解决方案1】:

试试这个查询-

DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);

更多信息请点击以下链接-

https://social.msdn.microsoft.com/Forums/en-US/ed9c6a6a-a93e-4bf5-a892-d8471b84aa3b/distinct-in-datatable-or-dataview?forum=adodotnetdataset

我希望这会对你有所帮助。

【讨论】:

    【解决方案2】:

    解决方案 1:

    根据我理解的问题,我们需要考虑基于 EmployeeName 的重复项,我们不必担心其他列。如果是这种情况,下面的解决方案效果更好。

    foreach(DataRow r in dtFail.AsEnumerable())
      {
       if (!dt1.AsEnumerable().Any(r1 => r1["EmployeeName"] == r["EmployeeName"]))
          {
         // if you don't want to copy entire row create new DataRow 
         // with required fields and add that row.
          dt1.Rows.Add(r.ItemArray);
          }
      }
    

    如果您愿意,可以将 dt1 放回 dtFail。

    解决方案 2:

    如果我们需要考虑不同的行,我更喜欢下面的解决方案。

    var temp = dtFail.AsEnumerable().Distinct();
    dtFail = temp.CopyToDataTable();
    

    【讨论】:

      【解决方案3】:

      我不确定它是否有用。据我从您的问题中得知,您希望 EmployeeName 与其他列截然不同。但是,如果您执行 ToTable 并打开 distinct 标志,它将给出所有不同的行,无论那里涉及多少列。因此,如果您仅提及 EmployeeName,它显然会为您提供不同的 EmployeeName,而不是与其关联的所有列。

      所以,这就是我所做的,最初只选择不同的 EmployeeName 列并将其放入临时 DataTable dtt。

      DataTable dtt = dvFail.DefaultView.ToTable(true, "EmployeeName");
      

      其次,我创建了另一个临时数据表,我们在其中放置主数据表 dtFail 中的隔离行并手动设置列名。

      DataTable TempDataTable = new DataTable();
      DataTable dtFailed = new DataTable();
      

      准备 dtFailed DataTable 中的列。

           if (dtFailed.Columns.Count == 0)
           {
                 dtFailed.Columns.Add("EmployeeName");
                 dtFailed.Columns.Add("EmployeeRole");
                 dtFailed.Columns.Add("Status");
                 dtFailed.Columns.Add("Date");
           }
      

      遍历不同的 EmployeeName dtt DataTable 并匹配 EmployeeName 并将选定的 first 行保留在 TempDataTable 中。最后所有行都转移到 dtFailed 中。

           for (int j = 0; j < dtt.Rows.Count; j++)
           {
                 string EmployeeName = dtt.Rows[j]["EmployeeName"].ToString();
                 TempDataTable = dvFail.Select("EmployeeName = " + EmployeeName).CopyToDataTable();
                 dtFailed.Rows.Add(TempDataTable.Rows[0].ItemArray);
           }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        • 1970-01-01
        相关资源
        最近更新 更多