3

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 を使用しています。

4

2 に答える 2

0

It's not related to the quantity of method called in chain. You just need to call ToArrayAsync.

I think the problem is in Rx.NET. I sent a Pull Request to fix it: https://github.com/aspnet/EntityFramework/issues/2192

https://github.com/Reactive-Extensions/Rx.NET/pull/131/files

于 2015-09-04T03:59:30.873 に答える