2016-01-11 3 views
-1

Я хочу сделать запрос LINQ в этом методе быстрее:Как я могу ускорить этот запрос linq, пожалуйста?

public string GeneraCodiceListaEventi(DateTime data) 
{ 
    string codice = String.Empty; 

    string[] range1 = new string[] { "08:00", "08:30", "09:00", "09:30", "10:00", "10:30", "11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00", "14:30", "15:00", "15:30", "16:00", "16:30", "17:00", "17:30", "18:00", "18:30", "19:00", "19:30", "20:00" }; 
    string[] range2 = new string[] { "08:29", "08:30", "09:29", "09:59", "10:29", "10:59", "11:29", "11:59", "12:29", "12:59", "13:29", "13:59", "14:29", "14:59", "15:29", "15:59", "16:29", "16:59", "17:29", "17:59", "18:29", "18:59", "19:29", "19:59", "20:29" }; 

    using (DatabaseDataContext contestoDB = new DatabaseDataContext()) 
    { 
     contestoDB.ObjectTrackingEnabled = false; 

     for(int i=0; i<25; i++) 
     { 
      var eventi = (from db in contestoDB.Eventi 
          where db.DataPrenotazione.Date == data.Date && (db.DataPrenotazione.TimeOfDay >= TimeSpan.Parse(range1[i]) && db.DataPrenotazione.TimeOfDay <= TimeSpan.Parse(range2[i])) 
          select new 
          { 
           ID = db.ID, 
           IDCliente = db.IDCliente, 
           Note = db.Note, 
           Ore = db.DataPrenotazione.ToShortTimeString() 
          }); 

      if (eventi.Any()) 
      { 
       codice += "<li><span class='ora'>" + range1[i] + "</span><input type='checkbox' id='item-" + GetNumItem(range1[i]) + "'/><label for='item-" + GetNumItem(range1[i]) + "'>Espandi</label><ul>"; 

       foreach (var e in eventi) 
       { 
        codice += "<li class='app'> " + e.Ore + " - " + GetNominativoClienteDaID(e.IDCliente) + CheckNota(e.Note); 
       } 

       codice += "</ul></li>"; 
      } 
      else 
      { 
       codice += "<li><span class='ora'>" + range1[i] + "</span>" + noapp + "</li>"; 

      } 
     } 

    } 

    return codice; 
} 

В этой функции я построю строку для отправки HTML с помощью Ajax и шоу в браузере. Но как я могу сделать запрос быстрее? Есть ли альтернатива?

+0

Какая часть вашего запроса работает медленно? Прежде всего, постарайтесь избежать использования конкатенации строк в циклах - посмотрите на что-то вроде классов StringBuilder. – TZHX

+0

Не загружайте сущности из db в течение каждого цикла, создайте один запрос, получите все результаты и затем выполните итерацию и создайте html. – 3dd

+1

'GetNominativoClienteDaID',' CheckNota', 'GetNumItem' ... они тоже идут в базу данных? Помимо этого 'foreach' и' .Any() 'запрашивают базу данных дважды, а внешний' for', инициирует 25 запросов. Попытайтесь уменьшить это. Я предполагаю, что эта часть кода запрашивает базу данных уже 150 раз. Также нарушен диапазон '' 08:30 ''. – Caramiriel

ответ

1

я могу дать вам по меньшей мере, 2 предложения, чтобы получить этот метод выполняется быстрее:

1) Вместо того, чтобы использовать «строка CODICE = String.Empty;» вместо этого используйте StringBuilder, например: 'StringBuilder longString = new StringBuilder();' Возможно, вам придется добавить System.Text в ссылки на использование поверх вашего файла кода. StringBuilder гораздо быстрее, используя общую строку из многих причин вы можете прочитать здесь: String vs. StringBuilder

2) Вместо того, чтобы использовать 2 массивов строки, а затем разбор тех строк каждый раз, когда цикл в объекты TimeSpan, вы должны вместо создать 2 массива TIMESPANS. На данный момент вы конвертируете строки в 2 раза (2 массива) * 25 раз (ваш цикл), так что это 50 конверсий, которые вам не нужно делать.

Так вы можете немного оптимизировать свой код.

Затем, чтобы оптимизировать доступ к db, вы должны сделать только 1 запрос со всеми результатами, а затем построить html, разделяющий результаты с помощью кода. Больше запросов = больше времени

+0

Не компилятор уже использует построитель строк при конкатенации строк? – Caramiriel

+0

@Caramiriel Если это так, не будет никакого преимущества в производительности при использовании класса StringBuilder, но если вы сделаете тест, вы заметите, что существует большая разница в производительности. Кроме того, в прошлом я попытался построить строку BIG с использованием «string», и у меня возникло исключение stackOverFlow, которое нелегко с классом StringBuilder. – Fabio

+0

Grazie Fabio! Спасибо, Фабио! –

0

Помимо точки 3dd, скорость этого запроса почти не имеет никакого отношения к вашему C# -коду и всему, что связано с базой данных. Если Eventi и DataPrenotazione являются большими и неверно проиндексированы, запрос будет выполняться медленно. Он лучше всего изучается в SQL и анализируется с помощью любых инструментов, которые предоставляет ваша база данных для понимания производительности запросов.

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