如何检测数据表是另一个数据表的一部分

时间:2012-06-18 14:00:51

标签: c# asp.net .net linq datatable

如果我有两个数据表:

DT1 & DT2

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

你的回答:“不仅仅是id”

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

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();

说明:当DT1中至少有一个ID不在DT2中时,diff.Any()返回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();

答案 2 :(得分:0)

您可以使用Intersect运算符

var intersect = DT2.AsEnumerable()。相交(DT1.AsEnumerable(),                                                     DataRowComparer.Default);