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
Vb.net 如何对持续时间求和并在报告中显示_Vb.net_Linq - Fatal编程技术网

Vb.net 如何对持续时间求和并在报告中显示

Vb.net 如何对持续时间求和并在报告中显示,vb.net,linq,Vb.net,Linq,我得到的错误是Sum未声明或不在当前范围内。我需要在我的报告页脚中显示按employeeId分组的总小时数 关于这件事有什么建议吗?我可能会错在哪里。 提前感谢好的,VB.Net不是我的常规c语言,因此如果有任何错误,请原谅我 首先,您似乎有一个奇怪的查询语法和流畅语法的混合体,需要小心处理。此外,我认为无需计算 有许多EmployeeViewModel,每个都有单独的工作时间,但也有一个从其他ViewModel组成的总数,这也是没有意义的。你将如何展示?稍后应为报告计算总计,或者您需要更改Vi

我得到的错误是Sum未声明或不在当前范围内。我需要在我的报告页脚中显示按employeeId分组的总小时数

关于这件事有什么建议吗?我可能会错在哪里。
提前感谢

好的,VB.Net不是我的常规c语言,因此如果有任何错误,请原谅我

首先,您似乎有一个奇怪的查询语法和流畅语法的混合体,需要小心处理。此外,我认为无需计算

有许多EmployeeViewModel,每个都有单独的工作时间,但也有一个从其他ViewModel组成的总数,这也是没有意义的。你将如何展示?稍后应为报告计算总计,或者您需要更改ViewModel以获得工作小时列表和总计。此外,您不应该在此处设置HoursWorked,它应该是一个只读属性,返回计算值

我给你的第一个建议是。如果没有分组或使用聚合,Sum不可用

因此,我的解决方案如下:

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
现在,如果您按照上面的步骤创建一个新类,例如带有属性Start、End的WorkingHours,以及返回Start-End的只读属性HoursWorked

然后,您可以在EmployeeViewModel上拥有一个Total属性,如果您想将工作小时数求和,该属性将使用LINQ来给出总计

更像:

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

我想我可以帮你,但为了方便起见,你能告诉我db.Employee和db.HoursWorked的具体组成吗?您选择匿名类型是因为您不需要/不需要所有其他属性吗?我死得和您的代码完全一样,但仍然收到错误:重载解析失败,因为无法使用这些参数调用可访问的总和:我的代码与您的代码完全一样,仍然收到错误:重载解析失败,因为没有可以使用以下参数调用可访问总和:扩展方法的公共函数Sumselector As System.FuncOf,Decimal?在“System.Linq.Enumerable”中定义为“Decimal”:无法将类型为“System.TimeSpan”的值转换为“Decimal”。由于空间问题,我删除了Long、string、Double、DateTime等类型的其他字段。第一个字段我认为您需要使用您尝试过的新代码更新您的问题,然后我才能提供帮助。另一个很简单你想转换时间跨度?到小数点?这是无效的。把你试过的贴出来,我会帮你的。
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
                          }