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