13

2 つのプロパティが int 配列である DTO に投影するクエリを作成しようとしています。プロジェクションでの 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();

2 つの int[ ] プロパティである従業員と部門の場合、これらの値を取得するにはどうすればよいですか? 今のところ、チームのリストを取得してからループして DTO を作成しているだけです。

他の同様の質問を見たことがありますが、解決策がうまくいかないようです。私は関係をたどっているので、追加のステップを踏む必要があるのではないかと思います.

4

2 に答える 2

19

このクエリを 2 つの異なるステップに分ける必要があります。1 つ目は正しい結果を取得し、2 つ目はデータを 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();
于 2013-05-24T17:11:56.743 に答える