我有两个DataTable,dt1
,dt2
。我编写了一个类来比较两个DataTable并获得不同的行。
表格dt1:
Col 1 Col 2 Col 3
A 8 @
B 21 ()
表格dt2:
Col 1 Col 2 Col 3
A 8 ^%^%^%
C 827 _++)
它显示不同的行:
B 21 ()
我发布我的功能进行比较:
public static DataTable CompareDataTables(DataTable first, DataTable second)
{
first.TableName = "FirstTable";
second.TableName = "SecondTable";
//Create Empty Table
DataTable table = new DataTable("Difference");
try
{
//Must use a Dataset to make use of a DataRelation object
using (DataSet ds = new DataSet())
{
//Add tables
ds.Tables.AddRange(new DataTable[] { first.Copy(), second.Copy() });
//Get Columns for DataRelation
DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count];
for (int i = 0; i < 2; i++)
{
firstcolumns[i] = ds.Tables[0].Columns[i];
}
DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count];
for (int i = 0; i < 2; i++)
{
secondcolumns[i] = ds.Tables[1].Columns[i];
}
//Create DataRelation
DataRelation r = new DataRelation(string.Empty, firstcolumns, secondcolumns, false);
ds.Relations.Add(r);
//Create columns for return table
for (int i = 0; i < first.Columns.Count; i++)
{
table.Columns.Add(first.Columns[i].ColumnName, first.Columns[i].DataType);
}
//If First Row not in Second, Add to return table.
table.BeginLoadData();
foreach (DataRow parentrow in ds.Tables[0].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r);
if (childrows == null || childrows.Length == 0)
table.LoadDataRow(parentrow.ItemArray, true);
}
table.EndLoadData();
}
}
catch (Exception ex) { }
return table;
}
tableDifferent
将包含所有不同的行。
DataTable tableDifferent;
tableDifferent = CompareDataTables(dt1, dt2);
我尝试使用代码:
var rowsToDelete = from r1 in dt1.AsEnumerable()
join r2 in tableDifferent.AsEnumerable()
on r1.Field<String>("StudentID") equals r2.Field<String>("StudentID")
select r1;
现在,我想删除dt1
和dt2
中的所有行,只保留tableDifferent
中的所有行。
有什么方法可以做到吗?
答案 0 :(得分:0)
如果剩下的唯一问题是清除其他数据表,则可以使用DataTable.Clear Method ()
删除所有表中的所有行。如果是,则生成异常 table具有任何会导致子行的强制子关系 孤儿。
如果DataSet绑定到XmlDataDocument,则调用DataSet.Clear 或DataTable.Clear引发NotSupportedException。为了避免这种情况 情况,遍历每个表,一次删除一行。什么时候 您使用NewRow创建新行,必须先处理行 你打电话给Clear
在你的情况下:
dt1.Clear();
dt2.Clear();