使行不同并显示所有列

问题描述 投票:0回答:3

在我的项目中有两个数据表

dtFail
dtFailed
dtFailed
除了列名声明之外什么都没有)。
dtFail
具有重复的“EmployeeName”列值。所以我采取了一个数据视图
dvFail
并执行了使它们不同的过程,如下面的代码所示:

dt失败

enter image description here

我尝试了以下代码:

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

dt失败只有一列

enter image description here

如果我喜欢下面的

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

dtFailed显示但有重复行

enter image description here

然后数据表

dtFailed
也存储重复的“EmployeeName”。

c# datatable dataset dataview
3个回答
7
投票

尝试这个查询:

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


1
投票

解决方案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();

0
投票

我不确定这是否有帮助。据我从你的问题中得知,你希望

EmployeeName
与其他列不同。但是,如果您执行
ToTable
并打开不同的标志,它将给出所有不同的行,无论其中涉及多少列。因此,如果您仅提及 EmployeeName,它显然会给您不同的 EmployeeName,而不是与其关联的所有列。

所以,这就是我所做的,最初仅选择不同的

EmployeeName
列并将其放入临时数据表 dtt 中。

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

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

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

准备 dtFailed 数据表中的列。

     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);
     }
© www.soinside.com 2019 - 2024. All rights reserved.