1

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

数据表 1

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

数据表 2

COLA  |  COLB  |  COLC 
 1       123      321
 2       321      333

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

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

我怎样才能在 LINQ 中做到这一点?

我强烈希望结果是数据表,或 Ienumerable 或易于更改回数据表的东西。如果不可能,我会管理的。

4

2 回答 2

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为 null 意味着记录中的记录table1不匹配。我建议不要使用该Any方法,因为它可能会枚举table2中的每一行table1(对于较大的集合,这很糟糕)。LINQ Join 将仅枚举两个表一次,以便为您指定的选择器函数找到匹配对。

于 2012-08-01T19:14:06.433 回答
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"));
于 2012-08-01T18:57:50.370 回答