【发布时间】:2014-07-24 11:54:12
【问题描述】:
我正在研究一种方法,该方法接收两个数据表和一个主键列名称列表并返回匹配项。我没有关于这些表的任何其他信息。
我已经在该网站上搜索了该问题的解决方案并找到了一些答案,但没有一个给我足够快的解决方案。
根据 stackoverflow 的结果,我现在有了这个:
var matches =
(from rowA in tableA.AsEnumerable()
from rowB in tableB.AsEnumerable()
where primaryKeyColumnNames.All(column => rowA[column].ToString() == rowB[column].ToString())
select new { rowA, rowB });
问题是这真的很慢。两张 8000 行的表需要 4 分钟。在我开始使用 stackoverflow 之前,我实际上是在遍历列和行,这需要 2 分钟。 (所以这实际上比我所拥有的要慢) 2-4 分钟似乎并没有那么糟糕,直到我用 350,000 行打到桌子上。这需要几天时间。我需要找到更好的解决方案。
谁能想到一个更快的方法?
编辑:根据 tinstaafl 的建议,现在这是我的代码。
var matches = tableA.Rows.Cast<DataRow>().Select(rowA => new
{
rowA,
rowB = tableB.Rows.Find(rowA.ItemArray.Where((x, y) =>
primaryKeyColumnNames.Contains(tableA.Columns[y].ColumnName,
StringComparer.InvariantCultureIgnoreCase)).ToArray())
})
.Where(x => x.rowB != null);
【问题讨论】:
-
等效的手工 SQL 查询的时间是多少?那是它可以走的最快速度。听起来整个过程都很缓慢。
-
我必须研究跨数据库查询。