質問: 私はEF-Coreとは独立した方法でクエリを構築して実行していますので、必要なレベルの抽象化を得るために`IQueryable`に依存しています。待っている`SingleAsync()`と待っている`SingleAsync()`呼び出しを置き換えています`SingleAsync()` `ToAsyncEnumerable().Single()`呼び出し。また、 `ToListAsync()`呼び出しを`ToAsyncEnumerable().ToList()`呼び出しに`ToAsyncEnumerable().ToList()`ます。しかし、私はちょうど`ToAsyncEnumerable()`メソッドで発生したので、私はそれを正しく使用しているかどうか`ToAsyncEnumerable()`ません。 私が参照している拡張メソッドを明確にするために、次のように定義します。 * `SingleAsync`と`ToListAsync`は、 `Microsoft.EntityFrameworkCore`名前空間とアセンブリの`EntityFrameworkQueryableExtensions`クラスで定義されています。 * `ToAsyncEnumerable`は、 `System.Interactive.Async`アセンブリの`System.Linq`名前空間の`AsyncEnumerable`クラスで定義されています。 クエリがEF-Coreに対して実行されるとき、 `ToAsyncEnumerable().Single()/ToList()` 、 `ToAsyncEnumerable().Single()/ToList()`と`SingleAsync()/ToListAsync()`は機能とパフォーマンスで同等ですか?もしそうでなければ、彼らはどうやって違いますか?
回答: シーケンスを返すメソッド( `ToListAsync` 、 `ToArrayAsync` ) `ToListAsync` 、私は違いを期待していません。 しかし、単一の値を返すメソッド( `First` 、 `FirstOrDefault` 、 `Single` 、 `Min` 、 `Max` 、 `Sum`などの非同期バージョン)では違いがあります。これは、 `IQueryable`対`IEnumerable`これらのメソッドを実行することによる違いと同じです。前者の場合、それらはデータベースクエリによって処理され、単一の値がクライアントに返され、後で結果セット全体がクライアントに返され、メモリ内で処理されます。 したがって、一般にEF Coreを抽象化するというアイデアは良いですが、クエリ可能なものの非同期処理が標準化されておらず、 `IEnumerable`変換することで実行コンテキストが変更されるため、 `IQueryable` LINQメソッドを返す単一の値。 PS標準化とは、次のことを意味します。 `IQueryable`の同期処理は、 `IQueryProvider` ( `System.Core.dll`アセンブリの`System.Linq`名前空間の**標準**インターフェイス)によって`Execute`ます。非同期処理では、EFコアの**カスタム** `IAsyncQueryProvider` ( `Microsoft.EntityFrameworkCore.Query.Internal`名前空間、 `Microsoft.EntityFrameworkCore.dll`アセンブリ内)と同様の別の**標準**インターフェイスを導入する必要があります。私はBCLチームの協力/承認が必要で、時間がかかると思うので、今はカスタムパスを取ることにしました。