Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较两个数据表并选择第二个表中不存在的行_C#_Winforms_System.data.datatable - Fatal编程技术网

C# 比较两个数据表并选择第二个表中不存在的行

C# 比较两个数据表并选择第二个表中不存在的行,c#,winforms,system.data.datatable,C#,Winforms,System.data.datatable,我有两个数据表,我想从第一个数据表中选择第二个数据表中不存在的行 例如: Table A id column 1 data1 2 data2 3 data3 4 data4 Table B id column 1 data10 3 data30 表A id列 1数据1 2数据2 3数据3 4数据4 表B id列 1数据10 3数据30 我希望结果是: Table C id column 2

我有两个数据表,我想从第一个数据表中选择第二个数据表中不存在的行

例如:

Table A id column 1 data1 2 data2 3 data3 4 data4 Table B id column 1 data10 3 data30 表A id列 1数据1 2数据2 3数据3 4数据4 表B id列 1数据10 3数据30 我希望结果是:

Table C id column 2 data2 4 data4 表C id列 2数据2 4数据4
您可以使用Linq,尤其是
可枚举。除了
有助于查找表A中不在表B中的id外:

var idsNotInB = TableA.AsEnumerable().Select(r => r.Field<int>("id"))
        .Except(TableB.AsEnumerable().Select(r => r.Field<int>("id")));
DataTable TableC = (from row in TableA.AsEnumerable()
                   join id in idsNotInB 
                   on row.Field<int>("id") equals id
                   select row).CopyToDataTable();

我得到了一个没有LINQ的解决方案:

public 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 < firstcolumns.Length; i++)
            {
                firstcolumns[i] = ds.Tables[0].Columns[i];
            }

            DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count];

            for (int i = 0; i < secondcolumns.Length; 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();

        }
    }
}
public DataTable CompareDataTables(DataTable第一,DataTable第二)
{
first.TableName=“FirstTable”;
second.TableName=“SecondTable”;
//创建空表
数据表=新数据表(“差异”);
尝试
{
//必须使用数据集才能使用DataRelation对象
使用(数据集ds=新数据集())
{
//添加表
AddRange(新数据表[]{first.Copy(),second.Copy()});
//获取DataRelation的列
DataColumn[]firstcolumns=新的DataColumn[ds.Tables[0].Columns.Count];
for(int i=0;i

对于更多的访问

您可以使用LinqEnumerable。除了方法函数以获得两个数据表之间的差异之外,我在这里使用firstDt和secondDt,请记住这两个Dt具有相同的结构

 var EntriesNotInB = firstDt.AsEnumerable().Select(r => r.Field<string>("abc")).Except(secondDt.AsEnumerable().Select(r => r.Field<string>("abc")));

        if (EntriesNotInB.Count() > 0)
        {
            DataTable dt = (from row in firstDt.AsEnumerable()join id in EntriesNotInB  on row.Field<string>("abc") equals id select row).CopyToDataTable();
            foreach (DataRow row in dt.Rows)
            {
              /////Place your code to manipulate on datatable Rows
            }
        }
var EntriesNotInB=firstDt.aseneumerable().Select(r=>r.Field(“abc”)。除了(secondDt.aseneumerable().Select(r=>r.Field(“abc”));
如果(EntriesNotInB.Count()>0)
{
DataTable dt=(从firstDt.AsEnumerable()中的行开始,行上EntriesNotInB中的联接id.Field(“abc”)等于id选择行);
foreach(数据行中的数据行)
{
/////将要操作的代码放在datatable行上
}
}
要阅读有关枚举的更多信息。除方法外,请转到


完成了!!!!快乐编码

到目前为止,您的代码是什么样子的?非常感谢您的回答。你的解决方案对我来说非常有效。
 var EntriesNotInB = firstDt.AsEnumerable().Select(r => r.Field<string>("abc")).Except(secondDt.AsEnumerable().Select(r => r.Field<string>("abc")));

        if (EntriesNotInB.Count() > 0)
        {
            DataTable dt = (from row in firstDt.AsEnumerable()join id in EntriesNotInB  on row.Field<string>("abc") equals id select row).CopyToDataTable();
            foreach (DataRow row in dt.Rows)
            {
              /////Place your code to manipulate on datatable Rows
            }
        }