【问题标题】:need help around IQueryable query result需要有关 IQueryable 查询结果的帮助
【发布时间】:2013-08-23 23:56:42
【问题描述】:

假设以下表格

人物

  • 身份证
  • 姓名

个人团队

  • 身份证
  • person_id
  • is_supervisor
  • team_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 > 的地方?

【问题讨论】:

  • 在查询末尾添加.ToList
  • ToList() 给出了一个 List>,并不是我真正需要的。

标签: c# linq iqueryable


【解决方案1】:

为什么我会得到这样的结果?我期待更多ICollection&lt;TimeSheet&gt;

IQueryable&lt;T&gt; IEnumerable&lt;T&gt;。它返回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);

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

如何从IQueryable&lt;ICollection&lt;TimeSheet&gt;&gt; 获取TimeSheet[]

(首先用第一部分改成IQueryable&lt;TimeSheet&gt;

您可以调用ToArrayToList 等“转换”方法之一,将查询“水合”为具体类型。

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

【讨论】:

  • 我很想把结果弄平。但是您编写的 SelectMany() 不能正常工作。无论如何这很有趣。我正在工作。
  • (...).Select(z =&gt; z.Team).SelectMany( t =&gt; t.TimeSheet); 更好。我想关于数据库关系。
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
相关资源
最近更新 更多