我有以下声明需要很长时间才能加载。任何人都可以告诉我如何解决这个性能问题,并仍然得到相同的结果每小时计数。我必须首先循环每台机器并循环每台机器每小时。
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++;
}
}
}
}
我会更好地为每台机器做一个声明还是留下它是怎么回事?
答案 0 :(得分:1)
我认为由于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
结果对于内存来说太大,那么删除它上面的.ToList并将其用作IQueryable。
答案 1 :(得分: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++;
}
}
}
但我看不到你在哪里定义变量row,col和StartDate。
答案 2 :(得分:0)
你可以一步一步查询。所以(p =&gt; p.DATE_TIME&gt; = StartDate&amp;&amp; p.DATE_TIME&lt; = END_DATE).GroupBy(p =&gt; p.DATE_TIME.Hour )