LINQ使用字符串列连接两个表
本文关键字:两个 连接 字符串 LINQ | 更新日期: 2023-09-27 18:12:57
我正在尝试比较两个表。我想找出哪些行存在于table1,不存在于table2。oData和oDataiSeries是数据表,并且被正确填充。
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中,列"SLOT"为String部分问题:我使用VS 2015,而调试(鼠标悬停在DataTable对象,应该包含结果),表没有显示适当的结果。它显示了oData的值,而不是oData和oDataiSeries之间的比较。我不确定我是否只是误解了VS2015如何显示var表,或者这是一个错误。如果我将结果DataTable绑定到gridview对象,它将显示与调试器不同的行。我最终使用了@D Stanley的解决方案,并进行了一些修改。
我想知道哪些行在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
是一个内部连接默认情况下,所以所有记录将有两个数据集之间的匹配值。