快速连接两个大型DataTable

时间:2015-04-02 00:05:14

标签: c# linq datatable ado.net

我有两个大的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:这些关键字段并不总是数据表的主键

1 个答案:

答案 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 };