查找数据表中不匹配的值

本文关键字:不匹配 数据表 查找 | 更新日期: 2023-09-27 17:50:24

我正在努力解决以下问题:

有2个数据表(在我的情况下是SSFE和FE)。FE将包含与SSFE匹配的项,但它也将包含在SSFE中不存在的值。

例如

SSFE 1, 2, 3, 4, 5, 6, 9、10

铁1,2,3,4,5,6,7,8,9,10,11

我需要的输出在这个例子中是:7,8,11。

我使用以下代码来查找匹配的项:

        DataSet set = new DataSet();
        //wrap the tables in a DataSet.
        set.Tables.Add(SSFEData);
        set.Tables.Add(FEData);
        //Creates a ForeignKey like Join between two tables.
        //Table1 will be the parent. Table2 will be the child.
        DataRelation relation = new DataRelation("IdJoin", SSFEData.Columns[0], FEData.Columns[0], false);
        //Have the DataSet perform the join.
        set.Relations.Add(relation);
        //Loop through table1 without using LINQ.
        for (int i = 0; i < SSFEData.Rows.Count; i++)
        {
            //If any rows in Table2 have the same Id as the current row in Table1
            if (SSFEData.Rows[i].GetChildRows(relation).Length > 0)
            {
                SSFEData.Rows[i]["PackageError"] = SSFEData.Rows[i].GetChildRows(relation)[0][1];
                SSFEData.Rows[i]["SaleError"] = SSFEData.Rows[i].GetChildRows(relation)[0][2];
            }
        }

应该有一个技巧来找到这些没有关系的项。

任何建议将是伟大的!

查找数据表中不匹配的值

当然,您可以使用一点点LINQ,通过使用AsEnumerable() 1扩展方法将数据表转换为IEnumerables

我用几个假设来说明这一点:

  1. "id"为FEDataSSFEData中行对应的整数值列。
  2. "id"是FEDataSSFEData上的主键列。

那么这将返回FEData中没有出现在SSFEData中的行列表:

var notInSSFEData = FEData.AsEnumerable()
    .Where(x => SSFEData.Rows.Find((object)x.Field<int>("id")) == null)
    .ToList();

如果上述假设2不成立(即"id"字段不是主键),则需要稍微复杂一点的查询。

var notInSSFEData = FEData.AsEnumerable()
    .Where(x1 => !SSFEData.AsEnumerable().Any(x2 => x2.Field<int>("id") == x1.Field<int>("id")))
    .ToList();

1这需要添加对System.Data.DataSetExtensions的引用(在System.Data.DataSetExtensions.dll中)