通过linq连接Datatables
本文关键字:Datatables 连接 linq 通过 | 更新日期: 2023-09-27 18:27:13
我正在尝试在此处执行LEFT OUTER联接。
var row = from r0w1 in dt.AsEnumerable()
join r0w2 in curdt.AsEnumerable()
on r0w1.Field<string>("B") equals r0w2.Field<string>("cr_B")
join r0w3 in tbmdt.AsEnumerable()
on r0w1.Field<string>("B") equals r0w3.Field<string>("tb_B") into ps
from r0w3 in ps.DefaultIfEmpty()
select new string[] { serial_number++.ToString() }
.Concat(r0w1.ItemArray.Concat
(r0w2 != null ? r0w2.ItemArray.Skip(1) : new object[] { "", "", "", "" })
.Concat(r0w3 != null ? r0w3.ItemArray.Skip(1) : new object[] { "", "", "", "" })).ToArray();
在上面的查询中,我希望拥有r0w1中的所有行,但得到的行更少。此查询对于LEFT OUTER JOIN是否正确?
我认为问题出在这个:
join r0w2 in curdt.AsEnumerable()
on r0w1.Field<string>("B") equals r0w2.Field<string>("cr_B")
这将被翻译为普通联接。我知道您并不是在询问左联接的语法。但我建议使用不同的联接语法。像这样:
from r0w1 in dt.AsEnumerable()
from r0w2 in curdt.AsEnumerable()
.Where(w=>w.Field<string>("cr_B")==r0w1.Field<string>("B")).DefaultIfEmpty()
from r0w3 in tbmdt.AsEnumerable()
.Where(w=>w.Field<string>("tb_B")==r0w1.Field<string>("B")).DefaultIfEmpty()
这两者都将被翻译为左加入