通过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是否正确?

通过linq连接Datatables

我认为问题出在这个:

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()

这两者都将被翻译为左加入