每天每小时问题的 LINQ 语句



我有以下语句需要很长时间才能加载。谁能告诉我如何解决这个性能问题,并且每小时仍然得到相同的结果。我必须首先遍历每台机器,然后每小时循环遍历每台机器。

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++;
            }
        }
    }
}

我最好为每台机器做一个语句还是保持原样?

我相信

由于 Linq 的 IQueryable 性质,您让代码多次获取内容,这会导致速度变慢。让我们将其分解为几个步骤,看看我们是否可以吸取影响。

人们需要通过将其放入列表中并远离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如果结果对于内存来说太大,请删除 .在上面列出并用作IQueryable。

根据你的代码试试这个

    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++;
            }
        }
    }

但我没有看到你在哪里定义变量行、列和开始日期。

您可以通过执行 一次性查询所有内容。其中(p => p.DATE_TIME>= StartDate && p.DATE_TIME <= END_DATE)。GroupBy(p => p.DATE_TIME.小时)

最新更新