Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ-使用group by和sum连接3个表_C#_Linq_Join_Linq To Sql_Group By - Fatal编程技术网

C# LINQ-使用group by和sum连接3个表

C# LINQ-使用group by和sum连接3个表,c#,linq,join,linq-to-sql,group-by,C#,Linq,Join,Linq To Sql,Group By,我正在尝试将以下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 Employ

我正在尝试将以下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
};

您的join子句之一是子查询。为了让事情变得更简单,您应该将以下内容分开:

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}

请尝试以下查询。我已经更改了
联接的顺序
,只是为了保持它与sql查询中的顺序相同。您在尝试中缺少的部分不仅仅是按名称分组,因为现在它不在嵌套查询中(如果您尝试在不使用嵌套查询的情况下执行sql,也必须这样做)

如果要创建与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
             };

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