2016-06-21 126 views
1

我有我的编程如果有人输入生产全日C#程序,我计算了机器的(MU),这样,平均是分组:使用LINQ to SQL

Date  | Part Number | Mold Num | Machine Num | MU 
2/12/2016 | 1185-5B8 | 6580 | 12   | .428    
2/12/2016 | 2249300  | 7797 | 36   | .271    
2/12/2016 | 146865  | 5096789 | 12   | .260    
2/16/2016 | 123456  | 7787 | 56   | .354    
2/16/2016 | 123456  | 787  | 54   | .45    
2/16/2016 | 123456  | 777  | 56   | .799    
2/16/2016 | 123456  | 87  | 54   | .611   

如何我会组都是在同一个表像这样的数据:

2/12/2016     2/16/2016 
Machine Num. | MU   Machine Num. | MU 
    12  | 34.4%   54  | 53.0% 
    36  | 27.1%   56  | 57.6% 

表,一切都是在被称为[MU报告]

编辑:

MU =可用时间Ran/Time。所以我所做的就是计算每个单独条目的MU,以便稍后取平均值。

+1

工作,你应该张贴什么你试图做的,索要小费,如果你不能进行任何更多的自己。你不应该让别人去做你的工作。 –

+0

这太宽泛了:“有太多可能的答案,或者对于这种格式,好的答案会太长,请添加详细信息以缩小答案集或隔离几个段落中可以回答的问题。” –

+0

@LeandroSoares我不知道如何做到这一点,因为我所看到的所有事情都是通过2张表来完成的,这是我实际上必须做的过于简化的版本。我只想要一个基本的理解,以便完成剩下的工作。 – JCM

回答

1

Working Demo

类(样品)每台机器每天平均:

public class MachineData 
{ 
    public DateTime Date { get; set; } 

    public string PartNumber { get; set; } 

    public int MoldNum { get; set; } 

    public int MachineNum { get; set; } 

    public decimal MU { get; set; } 
} 

查询:

var query = 
    dbItems 
     .GroupBy(x => new { x.Date, x.MachineNum }) 
     .Select(x => new 
     { 
      Date = x.Key.Date, 
      MachineNum = x.Key.MachineNum, 
      AverageMU = x.Average(i => i.MU * 100) 
     }) 
     .ToList(); 

GroupBy(x => new { x.Date, x.MachineNum })

在这里您可以将所有项目按日期和MachineNum

.Select(x => new 
{ 
     Date = x.Key.Date, 
     MachineNum = x.Key.MachineNum, 
     AverageMU = x.Average(i => i.MU * 100) 
     // Instead of x.Average you may used other functions like: Count, Any etc. 
}) 

以下Select将创建一个匿名类型将包含:DateMachineNumMU * 100平均得到的百分比。

PS:我用的λ,而不是纯LINQ的,因为我真的不喜欢LINQ

+0

我会用什么来代替'dbItems'?这是我打电话给我的桌子的名字吗? – JCM

+0

是的,这是你的'database.TableName'你使用'entityframework'吗? –

+0

当我尝试执行'database.TableName'时,它不能识别表,但是如果我自己键入表,它确实会表示该表不包含'.GroupBy'的定义。是的,我正在使用'entityframework' – JCM

0

由于平均是基于一天只有和分组基于两个日期和机号,则需要级别的分组:

一个。计算每天的总数。

b。计算基于上述总计

var dailyTotals = sampleData.GroupBy(x => x.Date) 
          .ToLookup(x => x.Key, x => x.Sum(y => y.MU)); 

var groupedData = (from m in sampleData 
        group m by new { m.Date, m.MachineNum } into grp 
        let dailyTotal = dailyTotals[grp.Key.Date].FirstOrDefault() 
        let dailyMachineTotal = grp.Sum(x => x.MU) 
        select new 
        { 
         Date = grp.Key.Date, 
         MachineNumber = grp.Key.MachineNum, 
         MU = (dailyMachineTotal/dailyTotal) * 100 
        }).ToList(); 
+0

但是你按日期分组,因为没有必要计算每日总数,因为所有由组提供的项目将有同一天变量'grp' –

+0

我觉得这只是增加了一个不需要的步骤。单独取出所有机器的平均值并按照上面的方法进行操作应得出相同的答案。 – JCM

+0

@LeandroSoares但是我们可能在同一天的grp之外有物品,因为它们有不同的机器编号。请记住,我们在这里分为两个字段。 – user3185569