2015-07-21 2 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() поможет. Сколько из 2 миллионов записей передает фильтр 'IsMatch()'? –

+0

Matthew, я обновил вопрос –

+1

Это очень неэффективно, если большинство записей передают фильтр 'IsMatch()'. Вам не нужно сортировать результаты запроса, так как вы берете только объект с самым низким 'OrderID'. Вместо этого используйте 'Min()'. – dymanoid

ответ

0

Try

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

В dymanoid упоминалось, OrderBy излишни.

TPL должны быть в состоянии использовать параллелизм в Where() и Min()

Смежные вопросы