我正在研究一种方法,该方法接收两个数据表和一个主键列名列表并返回匹配项。我没有关于表格的任何其他信息。
我已经在网站上搜索了这个问题的解决方案并找到了一些答案,但没有一个能给我一个足够快的解决方案。
根据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);
答案 0 :(得分:3)
使用PrimaryKey
的{{1}}属性,它将接受一列列,应该会有所帮助。也许是这样的:
DataTable
在一个包含2个9900行的表并且常常返回9800的测试中,大约需要1/3秒。