我有两个大的DataTable,需要通过它们的复合键相等来交叉它们 - 比如说来自一个表的字段("Id1", "Id2")
和来自另一个表的("MyId1", "MyId2")
。
我需要这个尽可能快地工作,因此数据行上的常规LINQ JOIN不是解决方案。我想为像<composite_key>/<datarow>
这样的表创建字典,然后将它们的键相交,这将显着加快工作速度。对于复合键,我需要使用Tuple
之类的东西来组合值并使比较成为可能。这种方法非常快,但是当我尝试比较像Tuple<int, int>(1,1)
和Tuple<short, short>(1,1)
这样的键时问题就出现了 - 因为类型参数不同,所以键永远不会相等。我现在看到的唯一选择是将关键字段预转换为最大覆盖类型(如字节,整数,长整数 - 长等)然后进行比较。不是一个很好的解决方案。
问题:
1.是否有与Tuple类似的东西可以比较“相似”类型的值?
2.还有其他快速方法可以连接两个数据表吗?
谢谢!
PS:这些关键字段并不总是数据表的主键
答案 0 :(得分:0)
您可以在Linq中使用相同类型进行相等性检查。使用扩展转换(short to int)来防止数据丢失。
var tableA = new List<Tuple<int, int>>() { new Tuple<int, int>(1, 1) };
var tableB = new List<Tuple<short, short>>() { new Tuple<short, short>(1, 1), new Tuple<short, short>(1, 2) };
var queryResult = from a in tableA
join b in tableB
on a equals new Tuple<int, int>((int)b.Item1, (int)b.Item2)
select new { a, b };