2015-10-10 40 views
2

我有一個代碼塊進行AsParallel PLINQ VS LINQ

var result = db.ProductReceives.Where(x => x.CustomerName.ToLower().Contains(searchTxt)).ToList(); 

工作正常,但當我寫同樣的查詢

var result = db.ProductReceives.AsParallel().Where(x => x.CustomerName.ToLower().Contains(searchTxt)).ToList(); 

它顯示了一個錯誤信息未設置爲一個實例 對象引用目的。

我想執行查詢AsParallel query.can有一個幫助嗎?

+0

您是否嘗試過使用調試器? –

+0

yap。但沒有一個線索 –

回答

5

如果你打的數據庫db提示,則:

  • 非並行代碼會被翻譯成一個SQL查詢,由DBMS直接執行。
    這是快速。特別是如果你有一個CustomerName的索引,因爲它只能掃描那個索引(否則你最終將得到一個完整的表掃描,但它可能會是仍然足夠快)。

  • 第二個將一個:

    • 下載整個ProductReceives表。所有的。
    • 然後它會爲每一行創建一個對象。
    • 然後它會將這些對象饋送給您的並行檢查。

    比第一溶液慢得多

你得到一個NullReferenceException因爲這些行中的一個具有NULLCustomerName。所以你最終打電話給((string)null).ToLower()

在第一種情況下不會發生該錯誤,因爲DMBS會自行過濾掉該錯誤。

0

可能您應該在致電ToLower之前檢查客戶姓名是否爲空。

db.Tv_ProductReceive.AsParallel().Where(i =>i.CustomerName != null && i.CustomerName.ToLower().Contains(searchTxt)).ToList(); 
+1

可能是你沒有站在我的問題。AsParallel()不工作,但簡單的工作在哪裏? –