2014-02-20 4 views
0

У меня есть следующее заявление, которое занимает много времени для загрузки. Может кто-нибудь посоветует мне, как я могу решить эту проблему с производительностью, и все равно получаю тот же результат за каждый час. Я должен зациклиться, хотя каждая машина сначала, и прокручивать каждый час для каждой машины.Заявление LINQ foreach hour in day issue

foreach (string MachineID in this.lboxMachines.SelectedItems) 
{ 
    if (this.lboxMachines.SelectedItems.Contains(GimaID)) 
    { 
     {   
      for (int i = 0; i <= 23; i++) 
      { 

       var PartsCast = (from p in ProductionEntity.PARTDATAs 
           where p.DATE_TIME >= StartDate 
           where p.DATE_TIME <= EndDate 
           where p.MACHINE == MachineID 
           select p).Count(); 

       StartDate.AddHours(1); 

       DT.Rows[row][col] = PartsCast; 
       col++; 
      } 
     } 
    } 
} 

Могу ли я лучше сделать одно заявление для каждой машины или оставить его как это?

+6

' StartDate.AddHours (1); 'не будет увеличиваться в' StartDate', вам нужно назначить результат так же, как 'StartDate = StartDate.AddHours (1);' – Habib

+0

, почему цикл выполняется 24 раза для каждого выбранного 'MachineID'? –

+0

Мне нужно получить счет между каждым часом в течение 24 часов в каждый день, есть ли лучший способ, которым я могу это сделать? – Inkey

ответ

0

Основываясь на вашем коде попробовать это

if (this.lboxMachines.SelectedItems != null && this.lboxMachines.SelectedItems.Contains(GimaID)) 
    {           
     foreach (string MachineID in this.lboxMachines.SelectedItems) 
     { 
      for (int i = 0; i <= 23; i++) 
      { 
       var PartsCast = (from p in ProductionEntity.PARTDATAs 
         where p.DATE_TIME >= StartDate 
         where p.DATE_TIME <= EndDate 
         where p.MACHINE == MachineID 
         select p).Count(); 

       StartDate = StartDate.AddHours(1); 

       DT.Rows[row][col] = PartsCast; 
       col++; 
      } 
     } 
    } 

, но я не вижу, где вы определяете переменные строки, седловины и StartDate.

1

Я считаю, что у вас есть код, который получает много раз из-за характера IQueryable Linq, который будет замедлять работу. Давайте разбить его на шаги, чтобы увидеть, можем ли мы извлечь урок.

Нужно nail вниз, что не меняется, попав в список и подальше от IQueryable. В приведенном ниже примере я игнорирую, куда идут данные, просто предоставив вам необходимую обработку и структуру для извлечения информации.

// Get the machines to process only once by not getting a queryable. 
var machines = 
this.lboxMachines.SelectedItems 
       .Where(machine => machine.Contains(GimaID)) 
       .ToList(); // Don't keep this IQueryable but as a hard list by this call. 

// Get *only* the parts to use; using one DB call 
var parts = ProductionEntity.PARTDATAs 
          .Where(part => machines.Contains(part.Machine)) 
          .ToList(); 

// Now from the parts get the count based off of the time each hour 
var resultPerHour = 
     Enumerable.Range(0, 24) 
       .Select (hour => new 
           { 
            Hour = hour, 
            Count = parts.Count(part => part.DATETIME >= StartDate.AdHours(hour) && part.DATETIME <= EnDate) 
           }); 

resultPerHour теперь может сообщаться пользователю.

Обратите внимание, что если parts результат слишком велик для памяти, то удалите с него .ToList и используйте его как IQueryable.

0

Вы можете запросить все на одном дыхании, делая .где (р => p.DATE_TIME> = StartDate & & p.DATE_TIME < = END_DATE) .GroupBy (р => p.DATE_TIME.Hour)