C# LINQ-使用group by和sum连接3个表
我正在尝试将以下SQL查询转换为LINQ: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
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
};