在我的项目中有两个数据表dtFail
和dtFailed
(dtFailed
只有列名称声明)。 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”。
请帮助
提前致谢。
答案 0 :(得分:6)
尝试此查询 -
DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);
如需更多信息,请点击以下链接 -
我希望这对你有所帮助。
答案 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);
}