我试图比较两张桌子。我想知道 table1 中存在哪些行,而不是 table2 中存在的行。 oData 和 oDataiSeries 是DataTables,并且已正确填充。
var testing = from table1 in oData.AsEnumerable()
join table2 in oDataiSeries.AsEnumerable() on table1.Field<string>("SLOT") equals table2.Field<string>("SLOT")
where table1.Field<string>("SLOT") != table2.Field<string>("SLOT")
select table1;
代码运行后testing 最终为null。但是,如果我要做以下事情。
var testingtable1 = from table1 in oData.AsEnumerable()
select table1;
var testingtable2 = from table2 in oDataiSeries.AsEnumerable()
select table2;
将填充testingtable1 和 testingtable2 。
是因为我试图比较字符串吗?
在 testingtable1 和 testingtable2 中,列&#34; SLOT&#34;是String
部分问题: 我正在使用VS 2015,并且在调试时(将鼠标悬停在应包含结果的DataTable对象上),表格没有显示正确的结果。它显示了oData的值,而不是oData和oDataiSeries之间的比较。我不确定我是否只是误解了VS2015如何显示var表,或者这是一个错误。如果我将结果DataTable绑定到gridview对象,它将与调试器相比显示不同的行。我最终使用了@D Stanley解决方案,并进行了一些修改。
答案 0 :(得分:4)
我想知道table1中存在哪些行,并且不存在于table2中。
你不需要加入。只需查看第二张表中没有匹配的记录:
var orphans = oData.AsEnumerable()
.Where(d => !oDataiSeries.AsEnumerable()
.Any(s => s.Field<string>("SLOT").Trim() == d.Field<string>("SLOT").Trim()));
或者如果您想首先提取值以提高性能,请尝试
var series = oDataiSeries.AsEmumerable()
.Select(s => s.Field<string>("SLOT"));
var orphans = oData.AsEmumerable()
.Where(d => !oDataiSeries.Contains(d.Field<string>("SLOT"));
是因为我试图比较字符串吗?
不,这是因为默认情况下join
是内部联接,因此所有记录都会在两个数据集之间具有匹配值。