从一个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();,似乎需要很长时间才会停止该程序。

那么,我做错了什么?

+0

做一个谷歌搜索linq编译quereys – 2012-01-17 23:19:57

Linq使用延迟执行。查询在使用时执行(未声明时)
为了获得更好的性能,可以使用类似下面的HashSet;

var set = new HashSet<int>(dtProducts.AsEnumerable().Select(p => p.colP)); 
var result = dtImport.AsEnumerable().Where(i => !set.Contains(i[colI])).ToList(); 
+0

哇!即时工作!虽然如果我没有测试他们之前将其标记为答案:)对其他人是不公平的。 – Christian 2012-01-18 09:25:47

预计会减速:直到枚举结果为止,查询才会被评估,因此您可以很快地在调试器中跳过此行:它只是准备查询数据源;查询是在枚举结果时完成的。

据我可以告诉了profiling你的代码,该问题可能与大外的DB选择,当您转换dtProductsdtImportIEnumerable出现这种情况:基本上,你把两个表中的数据到记忆,然后再做选择。如果你的桌子尺寸相当大,这可能是大部分时间都在。但是,再次,唯一可以确定的方法是分析。

您的查询很慢,因为它必须枚举dtImport中每个记录的产品。首先将产品放入字典中,以加快查询速度。

var prod = dtProducts.AsEnumerable().ToDictionary(p => p[colP]); 
var query = from imp in dtImport.AsEnumerable() 
      where !prod.ContainsKey(imp[colI]) 
      select imp;