Entity Framework 7 を使用していて、いくつかの linq で単純な間違いを犯しました (Skip を使用し、OrderBy 句を含めるのを忘れていました)。
これによってスローされた例外には、多数のネストされた集計例外が含まれていました。
例外を生成 (およびキャッチ) するコードは次のとおりです。
int[] newIds;
try
{
newIds = await db.Products
.Where(p => p.PortalId == portalId)
.Skip(ids.ProductIds.Count) //Skip the rows already read
.Take(takeTotal) //get the next block
.Select(p => p.ProductId)
.ToArrayAsync();
}
catch (AggregateException ex)
{
Console.WriteLine(ex.Message);
newIds = new int[] { };
}
上記のコードは、Asp.Net 5 WebApi コントローラーから呼び出されるリポジトリ クラスにあります。呼び出しのすべてのレベルで async-await が使用されています。
ただし、これから取得した集計例外は次のとおりです (これは、上記の 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.
ここで、実際の例外は、集約例外のレイヤー全体 (6 つのネストされたレイヤー) によってラップされています。集計例外が発生する理由は理解できますが、なぜそんなに多くの例外が発生するのだろうか? コントローラーのエントリポイントにバブルアップする前に例外を見ているので、なおさらです。
これは、async-await のレイヤーが多数ある結果でしょうか (6 つもあるとは思いません)、または EF7 実装の問題でしょうか?
これは現在、EF 7 リリース 7.0.0-beta4 を使用しています。