查找数据表中不匹配的值
本文关键字:不匹配 数据表 查找 | 更新日期: 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
。
我用几个假设来说明这一点:
- "id"为
FEData
和SSFEData
中行对应的整数值列。 - "id"是
FEData
和SSFEData
上的主键列。
那么这将返回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中)