在我的项目中有两个数据表
dtFail
和dtFailed
(dtFailed
除了列名声明之外什么都没有)。 dtFail
具有重复的“EmployeeName”列值。所以我采取了一个数据视图dvFail
并执行了使它们不同的过程,如下面的代码所示:
dt失败
我尝试了以下代码:
DataView dvFail = new DataView(dtFail);
dtFail = dvFail.ToTable(true, "EmployeeName"); //showing only one column in dtFail
dt失败(只有一列)
如果我喜欢下面的
DataView dvFail = new DataView(dtFail);
dtFail = dvFail.ToTable(true, "EmployeeName","EmployeeRole","Status");
dtFailed(显示但有重复行)
然后数据表
dtFailed
也存储重复的“EmployeeName”。
尝试这个查询:
DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);
欲了解更多信息,请访问此链接:
解决方案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();
我不确定这是否有帮助。据我从你的问题中得知,你希望
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);
}