LINQ使用字符串列连接两个表

本文关键字:两个 连接 字符串 LINQ | 更新日期: 2023-09-27 18:12:57

我正在尝试比较两个表。我想找出哪些行存在于table1,不存在于table2oDataoDataiSeries是数据表,并且被正确填充。

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;

testingtable1testingtable2将被填充。

是因为我在比较字符串吗?

testingtable1testingtable2中,列"SLOT"为String

部分问题:我使用VS 2015,而调试(鼠标悬停在DataTable对象,应该包含结果),表没有显示适当的结果。它显示了oData的值,而不是oData和oDataiSeries之间的比较。我不确定我是否只是误解了VS2015如何显示var表,或者这是一个错误。如果我将结果DataTable绑定到gridview对象,它将显示与调试器不同的行。我最终使用了@D Stanley的解决方案,并进行了一些修改。

LINQ使用字符串列连接两个表

我想知道哪些行在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是一个内部连接默认情况下,所以所有记录将有两个数据集之间的匹配值。