需要帮助IQueryable查询结果

时间:2013-08-23 23:56:43

标签: c# linq iqueryable

假设有以下表格

  • ID
  • 名称

PersonTeam

  • ID
  • 为person_id
  • is_supervisor
  • TEAM_ID

团队

  • ID

的TimeSheet

  • ID
  • TEAM_ID

我想为主管获取所有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

然后问题是:

  1. 为什么我得到那样的结果?
  2. 如何获取 TimeSheet [] ,其中 IQueryable&lt; ICollection&lt;时间表&gt; &gt;

1 个答案:

答案 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>

您可以调用其中一种“转化”方法,例如ToArrayToList,将查询“保湿”为具体类型。

你也可以调用“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`没有立即获取对象,但会在枚举时立即执行。