通过多个相似点查找

时间:2016-07-06 16:09:01

标签: c# entity-framework

我想要添加GroupBy语句。我有两张桌子可供选择:

MU_Reports表

Date      | Shift | Machine | MU
1/12/2016 |   1   |   12    | 44%
1/12/2016 |   2   |   12    | 34%
1/12/2016 |   2   |   12    | 34%
1/12/2016 |   3   |   12    | 54%
1/12/2016 |   3   |   13    | 24%

DownTime_Reports表

Date      | Shift | Machine | DT Code  |  DT_Hours
1/12/2016 |   1   |   12    | No Work  |    3
1/12/2016 |   2   |   12    | No Resin |    2
1/12/2016 |   2   |   12    | No Op.   |    4
1/12/2016 |   3   |   12    | No Work  |    1
1/12/2016 |   3   |   13    | No Work  |    5
1/12/2016 |   3   |   12    | No Work  |    5

示例输出:

Date      | Shift | Machine | MU   |  No_Work_Hours
1/12/2016 |   1   |   12    | 44%  |     3
1/12/2016 |   2   |   12    | 68%  |     0 
1/12/2016 |   3   |   12    | 54%  |     6
1/12/2016 |   3   |   13    | 24%  |     5

我当前的GroupBy语句在一个班次(无论是日期还是机器)中将所有“无工作”添加到一起:

using (var db = new ProductionContext())
{
    var query2 = from b in db.MU_Reports
                 join downtime in db.Downtime_Reports on new { b.Shift, b.Date, b.Machine_Number } equals new { downtime.Shift, downtime.Date, downtime.Machine_Number }
                 where downtime.DT_Code.Equals("No Work")
                 group downtime by new { b.Date, b.Shift, b.Machine, b.MU } into g
                 select new
                 {
                       Date = g.Key.Date,
                       Shift = g.Key.Shift,
                       Machine = g.Key.Machine,
                       MU = g.Key.MU,
                       NWTotal = g.Sum(x => x.No_Work_Hours)
                 };
}

正如您在我的示例输出中所看到的,我想要做的是同时在特定日期,班次和机器中添加所有No Work。因此换句话说,我必须通过Down_Time表来查看正确的日期然后查看这些日期以获得正确的班次然后获得正确的机器然后获得正确的DT理由以获得小时数。

编辑:我更新了代码,因为我试图进行多次连接,但是,现在我根本没有输出任何内容。

1 个答案:

答案 0 :(得分:0)

有几种方法可以产生所需的输出。他们需要首先按MU_ReportsDateShiftMachine表进行分组。然后,您可以通过DownTime_ReportsDateShift将分组的子查询group join to_timedeltaMachine表并执行聚合:

var query =
    from rg in db.MU_Reports.GroupBy(r => new { r.Date, r.Shift, r.Machine })
    join dt in db.Downtime_Reports
    on new { rg.Key.Date, rg.Key.Shift, rg.Key.Machine }
    equals new { dt.Date, dt.Shift, dt.Machine }
    into dtGroup
    select new
    {
        rg.Key.Date, rg.Key.Shift, rg.Key.Machine,
        MU = rg.Sum(r => r.MU),
        NWTotal = dtGroup.Where(dt => dt.DT_Code == "No Work").Sum(dt => dt.DT_Hours)
    };