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

时间:2015-09-16 15:52:33

标签: c# linq visual-studio-2015

我试图比较两张桌子。我想知道 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解决方案,并进行了一些修改。

1 个答案:

答案 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内部联接,因此所有记录都会在两个数据集之间具有匹配值。