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:如何使用动态键连接两个数据表的主要内容,如果未能解决你的问题,请参考以下文章