LINQ:如何使用动态密钥连接两个数据表

时间:2016-09-14 06:55:40

标签: c# linq join

我有两张桌子,比如说dt1和dt2 我想在dt1中找到数据但在dt2中根据某些列不匹配。(动态)

我想出的方法是将两个表连接起来,找到那些列为空值的列 但问题是我如何使用动态列号加入它们 例如,如果最初我想通过N列连接它们,但是如果dt2中的1列为空或为null,那么我想通过剩余的N-1列将它们连接起来。

例如:

DT1:

update: function(req, res) {
  User.update(req.body).exec(function(err, result){
    if (err) {
      // ups
    }
    return res.redirect('/something-after')
  });
}

DT2:

ColA, ColB, ColC, ColD
1A    1B    1C    1D
2A    2B    2C    2D
3A    3B    3C    3D
4A    4B    4C    4D

ColAA ColBB ColCC, ColE 1A 1B null 1E 2A 2X null 2E 3A 3B 3C 3E null null 4C 4E

如果其中一个为null,则加入其余列。

预期结果:

dt1 left join dt2 by ColA=ColAA, ColB=ColBB and ColC=ColCC

ColE中具有空值的数据是我想要的。(2A,2B,2C,2D,null)
现在我只能通过固定列加入它们,我怎样才能实现上面的场景。

非常感谢。

1 个答案:

答案 0 :(得分:1)

请参阅https://msdn.microsoft.com/en-us/library/bb882533.aspx

这听起来像你想要的:

         from d1 in dt1
         from d2 in dt2
         where (d1.ColA==d2.ColAA or d2.ColAA == null) and
               (d1.ColB==d2.ColBB or d2.ColBB == null) and
               (d1.ColC==d2.ColCC or d2.ColCC == null)
         select new { ..... };

我不确定您的问题是否这正是您想要的查询,您可能希望添加例如and (d1.ColA==d2.ColAA or d1.ColB==d2.ColBB or d1.ColC==d2.ColCC),以便他们无法链接所有空值