0

假设下表

  • ID
  • 姓名

个人团队

  • ID
  • person_id
  • is_supervisor
  • team_id

团队

  • ID

时间表

  • ID
  • team_id

我想获得主管的所有时间表。我得到了主管的名字,然后我需要选择他是哪个团队的主管。然后选择这些团队的所有时间表。

我相信以下查询确实

var allTimeSheets = ctx.PersonTeam.Where(y => y.Person.name == supervisor_name).Where(x => x.is_supervisor == true).Select(z => z.Team).Select(t => t.TimeSheet);

在此操作之后,我无法理解allTimeSheets

 IQueryable<ICollection<TimeSheet>>

我期待更多

 <ICollection<TimeSheet>>

或任何IEnumrable

然后问题是:

  1. 为什么我会得到这样的结果?
  2. 如何获得TimeSheet[]我得到IQueryable < ICollection < TimeSheet >>的地方?
4

1 回答 1

1

为什么我会得到这样的结果?我期待更多ICollection<TimeSheet>

一个IQueryable<T> 一个IEnumerable<T>。它返回 an 的原因IQueryable是您可以将其他方法链接OrderBy到它上面并将它们投影到实际的 SQL 中。

我才意识到你在问什么。要“展平”集合的集合,请使用SelectMany而不是两个链式Selects:

var allTimeSheets = ctx.PersonTeam
                       .Where(y => y.Person.name == supervisor_name 
                                && y.is_supervisor == true)
                       .SelectMany(z => z.Team, (z, t) => t.TimeSheet);

您的第二个问题的答案仍然适用:

我如何TimeSheet[]从一个IQueryable<ICollection<TimeSheet>>

(首先使用第一部分更改为IQueryable<TimeSheet>

您可以调用其中一种“转换”方法,例如ToArray, ToList,将查询“水合”为具体类型。

您也可以调用“AsEnumerable to cast to anIEnumerable to convert the query to Linq-To-Objects, which has better support for custom functions in sorts, filters, etc. Note that callingAsEunerable` 不会立即获取对象,但会在枚举集合后立即执行。

于 2013-08-24T00:02:39.470 回答