使行不同并显示所有列

时间:2012-10-20 07:56:02

标签: c# datatable dataset dataview

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

dtFail

enter image description here

我尝试了以下代码:

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

dtFailed 只有一列

enter image description here

如果我喜欢以下

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

dtFailed 显示但有重复行

enter image description here

然后数据表dtFailed也存储了重复的“EmployeeName”。

请帮助
提前致谢。

3 个答案:

答案 0 :(得分:6)

尝试此查询 -

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)

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

答案 2 :(得分:0)

我不确定它是否有用。至于我从您的问题中得出的结论,您希望EmployeeName与其他列无关。但是如果你做ToTable并打开不同的标志,它将给出所有不同的行,并不重要的是涉及多少列。因此,如果您仅提及EmployeeName,它显然会为您提供不同的EmployeeNames,而不是与之关联的所有列。

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

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

其次我创建了另一个临时DataTable,我们从主DataTable 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并在TempDataTable中保留选定的first行。最后所有行都转移到了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);
     }