質問: new int[] { }; } ``` 上記のコードは、Asp.Net 5 WebApiコントローラから呼び出されるrepoクラスにあります。通話のすべてのレベルで非同期待機が使用されています。 しかし、これから得た集計例外は(これは上記のcatchブロックから直接のウィンドウにダンプされます): > System.AggregateException:1つ以上のエラーが発生しました。 ---> System.AggregateException:1つ以上のエラーが発生しました。 ---> System.AggregateException:1つ以上のエラーが発生しました。 ---> System.AggregateException:1つ以上のエラーが発生しました。 ---> System.AggregateException:1つ以上のエラーが発生しました。 ---> System.AggregateException:1つ以上のエラーが発生しました。 ---> System.InvalidOperationException:Skip演算子を含むクエリには少なくとも1つのOrderBy操作が含まれている必要があります。 Microsoft.Data.Entity.Relational.Query.Sql.DefaultSqlQueryGenerator.GenerateLimitOffset(SelectExpression selectExpression):Microsoft.Data.Entity.Relational.Query.Sql.DefaultSqlQueryGenerator.VisitSelectExpression(SelectExpression selectExpression):Microsoft.Data.Entity.Relational.Query .Expressions.SelectExpression.Accept(ExpressionTreeVisitorビジター)Microsoft.Data.Entity.Relational.Query.Sql.DefaultSqlQueryGenerator.GenerateSql(SelectExpression selectExpression、IDictionary`2 parameterValues)などなど > > ここでは、実際の例外が集約例外(6つのネストされたレイヤー)のレイヤーで包まれてしまいました。私はなぜ集計例外を取得しているのか理解していますが、なぜそれらの多くが不思議でしたか?コントローラのエントリポイントにバブリングが戻ってしまう前に、例外を調べています。 これは、非同期待機のレイヤーの数(6つもないと思いませんか?)か、EF7の実装で問題になる可能性がありますか? これは現在、EF 7リリース7.0.0-beta4を使用しています。
回答: `Task`のMSDNページで説明されているように、 `Task`によってスローされたすべての例外は、待っているコードにスローされる前に`AggregateException`ラップされます。複数レベルのasync / awaitを使用していて、可能な限り低いレベルでこの例外をキャッチしない場合、別のレベルをバブルアップするたびに、再びラップされ、 `AggregateException`内の`AggregateException`つながります。キャッチすることなく待っています。 また、各操作がそれ自身のタスクとしてカウントされることもあります。すなわち、別の操作を追加するたびに、前の操作から結果が出て、前の操作を待つごとに結果が次の操作に戻されます。見てみましょう: ``` newIds = await db.Products // 1 .Where(p => p.PortalId == portalId) // 2 .Skip(ids.ProductIds.Count) // 3 .Take(takeTotal) // 4 .Select(p => p.ProductId) // 5 .ToArrayAsync(); // 6 ``` 6つの層の物、それぞれは前の結果を待っています。 6つの`AggregateException`レイヤー。あなたの例外は、6つのうちの3番目に起因していますが、エラーの性質から、EFがそれを実行する前にすべてのクエリを読み取る部分から来ている可能性があります。そうするうちに、得veは`.Skip()`一致なし`.OrderBy()` ステファン・クリアリーは 、物事ながらあなたは、コメントで私を思い出し`await`返す`Task`彼らはまた、あなたのためのアンラップの度合いを行うので、 `await`かなりのように動作していない`Task.Result` 、意味`await`スローする*必要があります*実際の例外は`AggregateException`ラップされません。これが意味するところは、せいぜい私たちはここで半分の答えしか持っていないということです(それは少し厄介で、すでに受け入れられています)。正直なところ、この回答を受け入れないようにして、他の人があなたの質問をスキップしないようにして、誰かがギャップを埋めるようなものを知っているかどうかを確認してください。