使用 LINQ 对其进行平均分组 SQL

Grouping with an average of it using LINQ to SQL

我有一个正在编写的 c# 程序,其中有人输入一整天的生产,我计算机器使用率 (MU),如下所示:

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          

我如何将所有相同 table 的数据分组,如下所示:

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

一切都在table的地方叫做[MU Report]

编辑:

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

由于平均值仅基于 并且分组基于 日期和机器编号 ,您需要级别分组:

一个。计算每天的总计。

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();

Working Demo

Class(样本):

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 })

在这里您可以按日期和机器编号对所有项目进行分组

.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:我使用 lambda 而不是纯 LINQ,因为我不太喜欢使用 LINQ