Public Function TotalHoursWorked() As IEnumerable(Of Reporting.EmployeeViewModel) Implements IReportRepository.TotalHoursWorked**
Dim qryEmployee = From emp In db.Employee _
.Select(Function(emp) New With {emp.EmployeeId, emp.EmployeeName}).AsEnumerable
Dim qryHoursWorked = From hw In db.HoursWorked
Select New With {hw.EmployeeId, hw.HoursWorkedStart, hw.HoursWorkedEnd}
Return (From emp In qryEmployee _
Join hw In qryHoursWorked On emp.EmployeeId Equals hw.EmployeeId _
Select New Reporting.EmployeeViewModel With {
.EmployeeName = emp.EmployeeName,
.HoursWorkedStart = RoundClockInTime(hw.HoursWorkedStart),
.HoursWorkedEnd = If(hw.HoursWorkedEnd.HasValue, RoundClockOutTime(hw.HoursWorkedEnd), hw.HoursWorkedEnd),
.HoursWorked = (.HoursWorkedStart - .HoursWorkedEnd),
.TotalHours = Sum(.HoursWorked)
})
End Function
我得到的错误是"Sum is either not declared or not in the current scope"
。我需要在employeeId分组的报告页脚中显示总小时数。
有关此事的任何消息。我可能会出错。 提前致谢
答案 0 :(得分:0)
是的,VB.Net不是我的语言(常规c#)所以如果有任何错误原谅我。
似乎从一开始就有一个奇怪的混合查询语法和流畅的语法,你需要小心。我认为AsEnumerable
也没有必要。
让一些EmployeeViewModel每个都有单独的工作时间也是没有意义的,但是也可以从其他ViewModel形成一个总数。你会如何展示?应该稍后为报告计算总数,或者您需要更改ViewModel以获得WorkingHours和Total的列表。此外,您不应在此处设置HoursWorked,它应该是一个只读属性,它返回计算值。
我对你的第一个建议是group join。如果没有分组或使用聚合,则无法使用Sum。
所以我的解决方案如下:
Dim Employees = From Employee In db.Employee
Select New With
{
.EmployeeId = Employee.EmployeeId,
.Name = Employee.EmployeeName
}
Dim WorkingHours = From HoursWorked In db.HoursWorked
Select New With
{
.EmployeeId = HoursWorked.EmployeeId,
.Start = HoursWorked.HoursWorkedStart
.End = HoursWorked.HoursWorkedEnd
}
Dim EmployeeWorkingHours = From Employee In Employees
Group Join HoursWorked In WorkingHours
On Employee.EmployeeId Equals HoursWorked.EmployeeId
Into EmployeeHoursWorked = Group, _
TotalHours = Sum(HoursWorked.Start - HoursWorked.End)
From EmployeeHours in EmployeeHoursWorked
Select New Reporting.EmployeeViewModel With
{
.EmployeeName = Employee.Name
.HoursWorkedStart = EmployeeHours.Start
.HoursWorkedEnd = EmployeeHours.End
.HoursWorked = (EmployeeHours.Start - EmployeeHours.End)
.TotalHours = CType(TotalHours, Integer?) _
.GetValueOrDefault(0)
}
现在,如果您按照上述步骤进行操作,例如WorkingHours具有属性Start,End和只读属性HoursWorked,返回(Start - End)。
然后,您可以在EmployeeViewModel上拥有一个Total属性,如果您想将MonthWorked相加以得到Total,那么它将使用LINQ。
更喜欢:
Dim WorkingHours = From HoursWorked In db.HoursWorked
Select New WorkingHours With
{
.EmployeeId = HoursWorked.EmployeeId,
.Start = HoursWorked.HoursWorkedStart
.End = HoursWorked.HoursWorkedEnd
}
Dim EmployeeWorkingHours = From Employee In Employees
Group Join HoursWorked In WorkingHours
On Employee.EmployeeId Equals HoursWorked.EmployeeId
Into EmployeeHoursWorked = Group
Select New Reporting.EmployeeViewModel With
{
.EmployeeName = Employee.Name
' This is an Enumerable<WorkingHours>
' which you can use in the ViewModel
' to calculate the total.
.WorkingHours = EmployeeHoursWorked
}