例如,我有两个看起来像这样的表
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或者很容易变回数据表的东西。如果不可能我会管理。
答案 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"));