【问题标题】:How to Sum the duration and display it in Report如何汇总持续时间并在报告中显示
【发布时间】:2013-07-19 04:39:50
【问题描述】:
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 分组的报表页脚中显示总小时数。

关于此的任何建议。我可能会出错的地方。 提前致谢

【问题讨论】:

  • 我想我可以帮助你,但为了让事情更容易,你能告诉我 db.Employee 和 db.HoursWorked 究竟是什么组成的吗?您是否选择匿名类型是因为您不需要/想要所有其他属性?

标签: vb.net linq


【解决方案1】:

是的,VB.Net 不是我的语言(常规 c#),所以如果有任何错误请见谅。

似乎一开始你就有一个奇怪的查询语法和流畅的语法混合在一起,你需要小心。还有AsEnumerable我觉得没必要。

同时拥有多个 EmployeeViewModel,每个都有单独的工作时间,但也可以由其他 ViewModel 形成一个总数,这也是没有意义的。你会如何展示它?以后应该为报告计算总计,或者您需要更改 ViewModel 以具有工作时间列表和总计。此外,您不应在此处设置 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)
                          }

现在,如果您按照上述方法创建一个新课程,例如具有属性 Start、End 和一个只读属性 HoursWorked 的 WorkingHours,它返回 (Start - End)。

然后,您可以在 EmployeeViewModel 上拥有一个 Total 属性,如果您想将 HoursWorked 相加以给出您的 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
                          }

【讨论】:

  • 我死的和你的代码一模一样,但我仍然收到错误:重载解析失败,因为无法使用这些参数调用 Sum:我的代码是
  • 我和你的代码完全一样,但仍然出现错误:重载解析失败,因为无法使用这些参数调用 Sum: Extension method 'Public Function Sum(selector As System.Func(Of ,十进制?))作为十进制?在“System.Linq.Enumerable”中定义:“System.TimeSpan?”类型的值不能转换为“十进制?”。由于空间问题,我删除了 Long、string、Double、DateTime 等其他字段。
  • 嗯,第一个我认为您需要使用您尝试过的新代码更新您的问题,然后我才能提供帮助。另一个很简单,您正在尝试转换 TimeSpan?到十进制?这是无效的。发布您尝试过的内容,我会提供帮助。
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 2019-06-23
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多