0

如果我有两个数据表:

DT1 & DT2

如何检查第一个是否包含第二个,我的意思是相同的DT2行在DT1.

4

3 回答 3

3

循环遍历表和比较字段(希望只是 ID)。根据数据表的结构,有多种方法可以做到这一点。

于 2012-06-18T14:04:26.413 回答
2

我的问题:“所有行的字段都必须与另一个 DataTable 的同一行的字段匹配吗?”

您的回答:“不只是 id”

您可以首先检查两者DataTables是否为空或两者是否具有相同的行数。然后,您可以使用 LINQ 来确定两者是否具有相同的 ID Enumerable.Except

var dt1IDs = DT1.AsEnumerable().Select(r => r.Field<int>("id"));
var dt2IDs = DT2.AsEnumerable().Select(r => r.Field<int>("id"));
var diff = dt1IDs.Except(dt2IDs);
var equal = DT1.Rows.Count == DT2.Rows.Count && !diff.Any();

说明:diff.Any()当 DT1 中至少有一个 id 不在 DT2 中时返回 true。

编辑:如果 ID不是唯一的并且可能重复,您需要检查 DT1 中的所有 ID 是否也在 DT2 中并且 DT2 的所有 ID 都在 DT1 中:

var DT1InDT2 = dt1IDs.Except(dt2IDs);
var DT2InDT1 = dt2IDs.Except(dt1IDs);
var equal = DT1.Rows.Count == DT2.Rows.Count && !DT1InDT2.Any() && !DT2InDT1.Any();

无论如何,这个查询是有效的。


Edit2:我刚刚看到我有点误解了你的requiremnet。您只想知道第一个表是否包含第二个,反之亦然。

var DT2IdNotInDT1 = dt2IDs.Except(dt1IDs);
var equal = !DT2IdNotInDT1.Any();
于 2012-06-18T14:15:21.210 回答
0

您可以使用相交运算符

var intersect = DT2.AsEnumerable().Intersect(DT1.AsEnumerable(), DataRowComparer.Default);

于 2012-06-18T14:11:08.313 回答