LINQ to Entities无法识别ToArray

Mat*_*tio 9 c# linq-to-entities

我正在尝试编写一个将投影到DTO的查询,其中两个属性是int数组.由于投影中的ToArray()调用,我收到错误.

teams = context
  .Teams
  .Include("TeamDepartments")
  .Include("TeamEmployees")
  .Select(t => new TeamDto
      {
          sourceSystemId = t.TeamId,
          name = t.Name,
          manager = t.EmployeeIdTeamManager,
          teamLead = t.EmployeeIdTeamLead,
          employees = t.TeamEmployees.Select(te => te.EmployeeId).ToArray(),
          departments = t.TeamDepartments.Select(td => td.DepartmentId).ToArray()
       })
  .ToList();
Run Code Online (Sandbox Code Playgroud)

对于两个int []属性的员工和部门,如何获取这些值?现在,我只是撤回团队列表,然后循环遍历它们以创建DTO.

我见过其他类似的问题,但解决方案似乎并不适合我.我怀疑我需要采取额外措施,因为我正在穿越一段关系.

Ada*_*ras 16

您需要做的是将此查询分为两个不同的步骤; 第一个将检索正确的结果,第二个将数据投影到您的DTO.像这样:

teams = context
  .Teams
  .Include("TeamDepartments")
  .Include("TeamEmployees")
  .Select(t => new // notice this is an anonymous object
      {
          sourceSystemId = t.TeamId,
          name = t.Name,
          manager = t.EmployeeIdTeamManager,
          teamLead = t.EmployeeIdTeamLead,
          employees = t.TeamEmployees.Select(te => te.EmployeeId),
          departments = t.TeamDepartments.Select(td => td.DepartmentId)
       })
  .ToList() // first run the query on the server without the ToArray calls
  .Select(obj => new TeamDto
      {     // then project the in-memory results onto your DTO.
          sourceSystemId = obj.sourceSystemId,
          name = obj.name,
          manager = obj.manager,
          teamLead = obj.teamLead,
          employees = obj.employees.ToArray(),
          departments = obj.departments.ToArray()
      })
  .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 第一个`ToList`是必要的,因为查询需要在服务器上运行,然后调用`Select`使用`ToArray`调用投射到DTO,因为这些调用无法转换为SQL. (3认同)