【问题标题】:LINQ - Join 3 tables with group by and sumLINQ - 使用 group by 和 sum 加入 3 个表
【发布时间】:2016-08-12 03:50:44
【问题描述】:

我尝试将以下 SQL 查询转换为 LINQ:

Select Employee.Name,
       ts.HoursWorked,
       People.Date 
FROM [dbo].[HoursWorked] as Employee
JOIN (SELECT [Employee], Sum([LaborTime]) as HoursWorked
      FROM [dbo].[TimeSheet]
      GROUP BY [Employee] ) ts
ON Employee.Employee = ts.Employee
JOIN [dbo].[PeopleData] People
ON Employee.Employee = People.Employee

我尝试了以下方法,但没有返回预期结果:

from ts in _context.TimeSheet
join es in _context.HoursWorked on ts.Employee equals es.Employee
join ed in _context.EmployeeDetailed on ts.Employee equals ed.Employee
group ts by ts.Employee into g
select new 
{
    Name = g.Key,
    HoursWorked = g.Sum(e => e.LaborTime),
    FirstDate = ??? //Not sure how to access es
};

【问题讨论】:

    标签: c# linq join linq-to-sql group-by


    【解决方案1】:

    尝试以下查询。我已经更改了joins 的顺序,只是为了让它像您的 sql 查询一样。您在尝试中缺少的部分不仅仅是按名称进行分组,因为现在它不在嵌套查询中(如果您尝试在没有嵌套查询的情况下执行 sql,您也必须这样做)

    var result = from es in _context.HoursWorked
                 join ts in _context.TimeSheet on es.Employee equals ts.Employee
                 join ed in _context.EmployeeDetailed on es.Employee equals ed.Employee
                 group ts by new { es.Name, ed.Date } into g
                 select new
                 {
                     Name = g.Key.Name,
                     FirstDate = g.Key.Date,
                     HoursWorked = g.Sum(e => e.LaborTime),
                 };
    

    如果你想像你的 sql 一样创建查询,那么:

    var result = from es in _context.HoursWorked
                 join ts in _context.TimeSheet.GroupBy(item => item.Employee)
                                     .Select(g => new { Employee = g.Key, HourseWorked = g.Sum(item => item.LaborTime) })
                 on es.Employee equals ts.Employee
                 join ed in _context.EmployeeDetailed on es.Employee equals ed.Employee
                 select new
                 {
                     Name = es.Employee,
                     HoursWorked = ts.HourseWorked,
                     FirstDate = ed.Date
                 };
    

    在查询语法中:

    var result = from es in _context.HoursWorked
                 join ts in (from item in _context.TimeSheet
                             group item by item.Employee into g
                             select new { Employee = g.Key, HourseWorked = g.Sum(item => item.LaborTime) })
                 on es.Employee equals ts.Employee
                 join ed in _context.EmployeeDetailed on es.Employee equals ed.Employee
                 select new
                 {
                     Name = es.Employee,
                     HoursWorked = ts.HourseWorked,
                     FirstDate = ed.Date
                 };
    

    【讨论】:

      【解决方案2】:

      您的连接子句之一是子查询。为了使事情变得更容易,您应该将其分开:

      var sub = from ts in _context.TimeSheet
                group ts by ts.Employee into g
                select new {
                    Employee = g.Key,
                    HoursWorked = g.Sum(p=>p.LaborTime)
                };
      

      然后你可以像这样进行整个查询:

      from emp in _context.HoursWorked
      join s in sub on emp.Employee equals s.Employee
      join pd in _context.PeopleData on emp.Employee equals pd.Employee
      select new {emp.Name, s.HoursWorked, emp.FirstDate}
      

      【讨论】:

        【解决方案3】:

        linq 查询的任何局部变量在组范围变量之后都无法实现。所以你不能访问 ed (ed.Date) 变量,因为它是在之前声明的

        group ts by ts.Employee into g
        

        此代码将起作用:

        var result = ts in _context.TimeSheet
                 group ts by ts.Employee into g
                 let singleG = g.FirstOrDefault()
                 join es in _context.HoursWorked  on singleG.Employee  equals  es.Employee
                 join ed in _context.PeopleData on es.Employee equals ed.Employee 
                 select new 
                 {
                  Name = g.Key,
                  HoursWorked = g.Sum(e => e.LaborTime),
                  FirstDate = ed.Date 
                 };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-09
          • 1970-01-01
          • 2017-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多