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