C# 从一个数据表而不是另一个数据表中选择行
我试图获取C# 从一个数据表而不是另一个数据表中选择行,c#,linq,datatable,filtering,C#,Linq,Datatable,Filtering,我试图获取DataTableA中的行列表,其中列1中的值不在DataTableB的Column1中 我使用以下LinQ查询 //Not in Database var query = from i in dtImport.AsEnumerable() where !dtProducts.AsEnumerable().Any(p => p[colP] == i[colI]) select i; 因此,我希望在导入表中列出产品表中尚未列出的产品
DataTableA
中的行列表,其中列1
中的值不在DataTableB
的Column1
中
我使用以下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()
或DataTable dtResult=query.CopyToDataTable()代码>似乎需要很长时间,所以我只是停止程序
那么,我做错了什么呢?预期速度会减慢:在枚举结果之前,查询不会得到计算,因此在调试器中很快跳过这一行:它所做的只是准备查询数据源;查询是在枚举结果时完成的
据我所知,在不分析代码的情况下,问题可能与将dtProducts
和dtImport
转换为IEnumerable
时发生的大量数据库外选择有关:本质上,在进行选择之前,将两个表中的数据放入内存。如果你的桌子相当大,这可能是大部分时间都去的地方。但是,唯一确定的方法是评测。Linq使用延迟执行。查询在使用时执行(不是在声明时执行)
为了获得更好的性能,您可以使用如下所示的哈希集
var set = new HashSet<int>(dtProducts.AsEnumerable().Select(p => p.colP));
var result = dtImport.AsEnumerable().Where(i => !set.Contains(i[colI])).ToList();
var set=newhashset(dtProducts.AsEnumerable().Select(p=>p.colP));
var result=dtImport.AsEnumerable()。其中(i=>!set.Contains(i[colI])).ToList();
您的查询速度很慢,因为它必须为dtImport中的每条记录枚举产品。首先将产品放入字典,以加快查询速度
var prod = dtProducts.AsEnumerable().ToDictionary(p => p[colP]);
var query = from imp in dtImport.AsEnumerable()
where !prod.ContainsKey(imp[colI])
select imp;
在linq编译的QuerySwow上进行谷歌搜索!这立刻就奏效了!虽然如果我在将此标记为答案之前不测试他们的答案,这对其他人来说是不公平的:)