从一个DataTable中选择行而不是另一个
我在试图获取DataTableA
中的行的列表,其中Column 1
中的值不在的Column1
中。从一个DataTable中选择行而不是另一个
我用下面的LINQ查询
//Not in Database
var query = from i in dtImport.AsEnumerable()
where !dtProducts.AsEnumerable().Any(p => p[colP] == i[colI])
select i;
这样的,我想的已经不是产品表产品在导入表的列表。
当我调试时,似乎很快就跳过了这一行,但当我打电话给与该查询有关的任何内容时,例如int rows = query.Count<DataRow>();
或DataTable dtResult = query.CopyToDataTable();
,似乎需要很长时间才会停止该程序。
那么,我做错了什么?
Linq使用延迟执行。查询在使用时执行(未声明时)
为了获得更好的性能,可以使用类似下面的HashSet
;
var set = new HashSet<int>(dtProducts.AsEnumerable().Select(p => p.colP));
var result = dtImport.AsEnumerable().Where(i => !set.Contains(i[colI])).ToList();
哇!即时工作!虽然如果我没有测试他们之前将其标记为答案:)对其他人是不公平的。 – Christian 2012-01-18 09:25:47
预计会减速:直到枚举结果为止,查询才会被评估,因此您可以很快地在调试器中跳过此行:它只是准备查询数据源;查询是在枚举结果时完成的。
据我可以告诉了profiling你的代码,该问题可能与大外的DB选择,当您转换dtProducts
和dtImport
到IEnumerable
出现这种情况:基本上,你把两个表中的数据到记忆,然后再做选择。如果你的桌子尺寸相当大,这可能是大部分时间都在。但是,再次,唯一可以确定的方法是分析。
您的查询很慢,因为它必须枚举dtImport中每个记录的产品。首先将产品放入字典中,以加快查询速度。
var prod = dtProducts.AsEnumerable().ToDictionary(p => p[colP]);
var query = from imp in dtImport.AsEnumerable()
where !prod.ContainsKey(imp[colI])
select imp;
做一个谷歌搜索linq编译quereys – 2012-01-17 23:19:57