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. IQueryable < ICollection < TimeSheet > >を取得したTimeSheet[]を取得する方法は?
4

1 に答える 1

1

なぜ私はそのような結果を得たのですか?もっと期待したICollection<TimeSheet>

アンIQueryable<T> ですIEnumerable<T>。を返す理由は、他のメソッドを連鎖させて実際の SQL に投影IQueryableできるようにするためです。OrderBy

私はあなたが求めていることを理解しました。コレクションのコレクションを「平坦化」するSelectManyには、2 つの連鎖したSelectの代わりに使用します。

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

2 番目の質問に対する答えは引き続き適用されます。

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 に答える