【问题标题】:Join, Group by and Sum in Linq在 Linq 中加入、分组和求和
【发布时间】:2022-01-22 21:38:48
【问题描述】:

我想通过employeeId 对员工的加班时间进行分组,并获取employeeNames 和员工每月加班总时长的数据。但是这个 Linq 查询给出了翻译错误。

var results = 
    from overtime in context.Overtimes
    join employeeCredential in context.EmployeeCredentials
        on overtime.EmployeeId equals employeeCredential.id
    join employeeDetail in context.EmployeeDetails
        on employeeCredential.id equals employeeDetail.employeeId
    where overtime.Month == month && overtime.Year == year
    group new { overtime, employeeCredential, employeeDetail } by overtime.EmployeeId into g
    select new MonthlyOvertimeWorkHours
    {
        EmployeeName = g.First().employeeDetail.employeeName,
        TotalWorkHourOfMonth = g.Sum(t => t.overtime.OvertimeWorkHour)
    };

错误

{ "error": employeeCredential\r\n IsNullable: True\r\n , \r\n employeeDetail = EntityShaperExpression: \r\n EntityType: EmployeeDetail\r\n ValueBufferExpression: \r\n ProjectionBindingExpression: employeeDetail\r\n IsNullable: True\r\n }\r\n .Select(s => s.employeeDetail.employeeName)\r\n .First()' 可以 不被翻译。要么重写查询形式, 翻译,或通过插入显式切换到客户端评估 调用“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或 'ToListAsync'。 }

【问题讨论】:

  • 它给出了什么错误?
  • “错误和失败”,400 美元:“这个查询给出了什么翻译错误?”
  • { "error": employeeCredential\r\n IsNullable: True\r\n , \r\n employeeDetail = EntityShaperExpression: \r\n EntityType: EmployeeDetail\r\n ValueBufferExpression: \r\ n ProjectionBindingExpression: employeeDetail\r\n IsNullable: True\r\n }\r\n .Select(s => s.employeeDetail.employeeName)\r\n .First()' 无法翻译。以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估。 }

标签: c# linq


【解决方案1】:

在 EF Core 6 之前,您无法在分组后访问记录(这通常很糟糕)。只有聚合和Key 可用。

要解决问题,只需将employeeName 添加到分组键。

var results = 
    from overtime in context.Overtimes
    join employeeCredential in context.EmployeeCredentials
        on overtime.EmployeeId equals employeeCredential.id
    join employeeDetail in context.EmployeeDetails
        on employeeCredential.id equals employeeDetail.employeeId
    where overtime.Month == month && overtime.Year == year
    group new { overtime, employeeCredential, employeeDetail } by new { overtime.EmployeeId, employeeDetail.employeeName } into g
    select new MonthlyOvertimeWorkHours
    {
        EmployeeName = g.Key.employeeName,
        TotalWorkHourOfMonth = g.Sum(t => t.overtime.OvertimeWorkHour)
    };

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多