假设有以下表格
人
PersonTeam
团队
的TimeSheet
我想为主管获取所有TimeSheets。我得到了主管的名字,然后我需要选择哪个团队他有主管角色。然后选择这些团队的所有时间表。
我相信以下查询
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 。
然后问题是:
答案 0 :(得分:1)
为什么我得到那种结果?我期待更多
ICollection<TimeSheet>
IQueryable<T>
IEnumerable<T>
。它返回IQueryable
的原因是你可以将OrderBy
之类的其他方法链接到它上面并将它们投射到实际的SQL中。
我刚刚意识到你在问什么。要“展平”集合集合,请使用SelectMany
而不是两个链Select
:
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 an
IEnumerable to convert the query to Linq-To-Objects, which has better support for custom functions in sorts, filters, etc. Note that calling
AsEnunerable`没有立即获取对象,但会在枚举时立即执行。