带有数据表的C#Linq - 从一个表中选择另一个表中不存在的内容

时间:2012-08-01 18:55:19

标签: c# linq

例如,我有两个看起来像这样的表

DATATABLE 1

COLA  |  COLB  |  COLC 
 1       123      321
 2       321      333
 3       222      232

DATATABLE 2

COLA  |  COLB  |  COLC 
 1       123      321
 2       321      333

我想从第一表中仅选择第3行。

我希望能够在COLA ID上将两个表连接在一起,但是只能从DATATABLE 1中选择DATATABLE 2中不存在的行。

如何在LINQ中执行此操作?

我非常希望结果是数据表,或者是Ienumerable或者很容易变回数据表的东西。如果不可能我会管理。

2 个答案:

答案 0 :(得分:7)

var rows = from t1 in table1.AsEnumerable()
           join t2 in table2.AsEnumerable() 
               on t1.Field<int>("COLA") equals t2.Field<int>("COLA") into tg
           from tcheck in tg.DefaultIfEmpty()
           where tcheck == null
           select t1

这最终执行左外连接,table2中任何为空的行表示table1中的记录没有匹配。我建议不要使用Any方法,因为它可能会为table2中的每一行枚举table1(对于较大的集合,这很糟糕)。 LINQ Join只会枚举两个表,以便找到您指定的选择器函数的匹配对。

答案 1 :(得分:3)

最简单的方法是:

var dt2Cola = new HashSet<int>(table2.AsEnumerable()
                                     .Select(x => x.Field<int>("COLA"));

var dt1Rows = table1.AsEnumerable()
                    .Where(x => !dt2Cola.Contains(x.Field<int>("COLA"));