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

Posted

技术标签:

【中文标题】LINQ:如何使用动态键连接两个数据表【英文标题】:LINQ: How to join two datatable with dynamic keys 【发布时间】:2016-09-14 06:55:40 【问题描述】:

我有两个表,例如 dt1 和 dt2。我想根据某些列在 dt1 中查找数据,但在 dt2 中不匹配。(动态)

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

例如:

dt1:

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

dt2:

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

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

如果其中之一为空,则加入其余列。

预期结果:

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

ColE中的值为null的数据就是我想要的。(2A,2B,2C,2D,null) 现在只能通过固定列加入它们,如何实现上述场景。

非常感谢。

【问题讨论】:

第1行和第2行的数据是一样的。但为什么在预期结果中,第 1 行和第 2 行不同?因为第 2 行中的 ColE 为空? 如果数据不存在,那么您就无法加入它,您需要某种形式的一致性,否则从长远来看,您将产生更大的问题 如果所有行的 ColCC 列都为 null 怎么办?所有行都具有相同的列,它们为空或填充了值。但我不知道在运行时哪一列将为空。例如,在第一轮中,ColCC 可能对所有行都为空,而在第二轮中,ColAA 和 ColBB 可能对所有行都为空。 【参考方案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) 以便它们无法链接所有空值

【讨论】:

据我了解,OP 需要的是 (d1.ColA==d2.ColAA and d2.ColAA != null) 加入两列,前提是列值不包含示例中显示的 null 广告

以上是关于LINQ:如何使用动态键连接两个数据表的主要内容,如果未能解决你的问题,请参考以下文章

动态 Linq 查询 - 如何构建 select 子句?

如何使用 Dynamic Linq 进行左外连接?

如何和我将“或”运算符引入 linq 查询连接

如何使用外键连接两个数据集以创建新数据集?

使用动态唯一键值对linq / lambda表达式列表过滤数据

如何使用LINQ中的条件重新排列选择结果