LINQ声明在一天中的小时问题

时间:2014-02-20 16:41:23

标签: c# 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++;
            }
        }
    }
}

我会更好地为每台机器做一个声明还是留下它是怎么回事?

3 个答案:

答案 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 )