2015-04-02 39 views
0

我有2个大的数据表,需要通过组合键的平等相交人 - 说从一个表,然后从其他("MyId1", "MyId2")领域("Id1", "Id2")快速连接两个大的DataTable

我需要这尽可能快地工作,所以经常LINQ的数据行JOIN是解决不了问题。我想为<composite_key>/<datarow>等表格创建字典,然后将它们的键相交,这将显着加快工作。对于复合键,我需要使用类似Tuple这样的组合值并进行比较。这个工程非常快,但问题是当我尝试比较喜欢Tuple<int, int>(1,1)Tuple<short, short>(1,1)键 - 因为类型参数不同,按键永远不会相等。我现在看到的唯一选择是将关键字段预转换为其最覆盖的类型(如字节,整数,长整数等),然后进行比较。不是一个很好的解决方案。 问题:
1.是否有类似的元组可以比较“相似”类型的值的东西吗?
2.是否有加入两个数据表等快速路?
谢谢!
PS:这些键字段并非总是数据表的主键

+1

创建一个数据库视图会比代码做 – Shekhar 2015-04-02 00:07:46

+0

@Shekhar在我的应用我可以从variuos源有数据,不仅从SQL服务器 – LINQ2Vodka 2015-04-02 00:08:43

回答

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 }; 
+0

由于更有效的,但我想解决问题以更常见的方式,就像我不仅有这些类型 – LINQ2Vodka 2015-04-02 02:10:49