2015-07-21 60 views
1

我有以下代碼使用Linq。如何提高我的linq查詢的性能?

return (from item in this 
      where item.IsMatch(orgid, postcode, shipmentMethod, providerCode) 
      orderby item.OrderID 
      select item.DTime).FirstOrDefault(); 

對於2百萬條記錄,它需要超過10分鐘才能返回一個值。 有人可以幫助我如何將此查詢轉換爲一個使用ParallelEnumerable

任何其他建議如何優化perfrormance歡迎..

***以上樣品是指從IEnumerable繼承我的自定義類。該IsMatch()方法具有一些內部條件:

public bool IsMatch(long orgid, string postcode, string shipmentMethod, string providerCode) 
{ 
    if (string.IsNullOrWhiteSpace(providerCode)) providerCode = null; 
    if (string.IsNullOrWhiteSpace(shipmentMethod) || shipmentMethod == "0") shipmentMethod = null; 
    return (OrgID == 0 || orgid == OrgID) && 
      PostcodeFrom.Length == postcode.Length && 
      string.CompareOrdinal(PostcodeFrom, postcode) <= 0 && 
      string.CompareOrdinal(PostcodeTo, postcode) >= 0 && 
      (ShipmentMethod == null || shipmentMethod == ShipmentMethod) &&     (ProviderCode == null || providerCode == ProviderCode); 
} 
+0

我不使用進行AsParallel()會幫助這裏的想法。 200萬條記錄中有多少通過'IsMatch()'過濾器? –

+0

Matthew,我已經更新了這個問題 –

+1

如果大部分記錄都通過了'IsMatch()'過濾器,這是非常低效的。您實際上不需要對查詢結果進行排序,因爲您只需要一個具有最低「OrderID」的對象。考慮使用'Min()'來代替。 – dymanoid

回答

0

嘗試

return this.AsParallel() 
    .Where(p=> p.IsMatch(orgid, postcode, shipmentMethod, providerCode)) 
    .Min(p=> p.OrderID) 
    .Select(p=> p.DTime); 

dymanoid提到OrderBy不用。

TPL應該能夠利用並行在Where()Min()