2012-01-17 60 views
1

我在試圖獲取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

回答

2

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

3

預計會減速:直到枚舉結果爲止,查詢纔會被評估,因此您可以很快地在調試器中跳過此行:它只是準備查詢數據源;查詢是在枚舉結果時完成的。

據我可以告訴了profiling你的代碼,該問題可能與大外的DB選擇,當您轉換dtProductsdtImportIEnumerable出現這種情況:基本上,你把兩個表中的數據到記憶,然後再做選擇。如果你的桌子尺寸相當大,這可能是大部分時間都在。但是,再次,唯一可以確定的方法是分析。

1

您的查詢很慢,因爲它必須枚舉dtImport中每個記錄的產品。首先將產品放入字典中,以加快查詢速度。

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