Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从一个数据表而不是另一个数据表中选择行_C#_Linq_Datatable_Filtering - Fatal编程技术网

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上进行谷歌搜索!这立刻就奏效了!虽然如果我在将此标记为答案之前不测试他们的答案,这对其他人来说是不公平的:)