如何求和持续时间并在报告中显示

时间:2013-07-19 04:39:51

标签: vb.net linq

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分组的报告页脚中显示总小时数。

有关此事的任何消息。我可能会出错。 提前致谢

1 个答案:

答案 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
                          }