如何在两个DataTable中保持所有行不同?

时间:2016-07-08 06:17:56

标签: c# linq

我有两个DataTable,dt1dt2。我编写了一个类来比较两个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;

现在,我想删除dt1dt2中的所有行,只保留tableDifferent中的所有行。

有什么方法可以做到吗?

1 个答案:

答案 0 :(得分:0)

如果剩下的唯一问题是清除其他数据表,则可以使用DataTable.Clear Method ()

  

删除所有表中的所有行。如果是,则生成异常   table具有任何会导致子行的强制子关系   孤儿。

     

如果DataSet绑定到XmlDataDocument,则调用DataSet.Clear   或DataTable.Clear引发NotSupportedException。为了避免这种情况   情况,遍历每个表,一次删除一行。什么时候   您使用NewRow创建新行,必须先处理行   你打电话给Clear

在你的情况下:

dt1.Clear();
dt2.Clear();