ToAsyncEnumerable()。Single()とSingleAsync()

.net-core entity-framework entity-framework-core linq system.reactive

質問

私はEF-Coreとは独立した方法でクエリを構築して実行していますので、必要なレベルの抽象化を得るためにIQueryable<T>に依存しています。待っているSingleAsync()と待っているSingleAsync()呼び出しを置き換えていますSingleAsync() ToAsyncEnumerable().Single()呼び出し。また、 ToListAsync()呼び出しをToAsyncEnumerable().ToList()呼び出しにToAsyncEnumerable().ToList()ます。しかし、私はちょうどToAsyncEnumerable()メソッドで発生したので、私はそれを正しく使用しているかどうかToAsyncEnumerable()ません。

私が参照している拡張メソッドを明確にするために、次のように定義します。

  • SingleAsyncToListAsyncは、 Microsoft.EntityFrameworkCore名前空間とアセンブリのEntityFrameworkQueryableExtensionsクラスで定義されています。
  • ToAsyncEnumerableは、 System.Interactive.AsyncアセンブリのSystem.Linq名前空間のAsyncEnumerableクラスで定義されています。

クエリがEF-Coreに対して実行されるとき、 ToAsyncEnumerable().Single()/ToList()ToAsyncEnumerable().Single()/ToList()SingleAsync()/ToListAsync()は機能とパフォーマンスで同等ですか?もしそうでなければ、彼らはどうやって違いますか?

受け入れられた回答

シーケンスを返すメソッド( ToListAsyncToArrayAsyncToListAsync 、私は違いを期待していません。

しかし、単一の値を返すメソッド( FirstFirstOrDefaultSingleMinMaxSumなどの非同期バージョン)では違いがあります。これは、 IQueryable<T>IEnumerable<T>これらのメソッドを実行することによる違いと同じです。前者の場合、それらはデータベースクエリによって処理され、単一の値がクライアントに返され、後で結果セット全体がクライアントに返され、メモリ内で処理されます。

したがって、一般にEF Coreを抽象化するというアイデアは良いですが、クエリ可能なものの非同期処理が標準化されておらず、 IEnumerable<T>変換することで実行コンテキストが変更されるため、 IQueryable<T> LINQメソッドを返す単一の値。

PS標準化とは、次のことを意味します。 IQueryableの同期処理は、 IQueryProviderSystem.Core.dllアセンブリのSystem.Linq名前空間の標準インターフェイス)によってExecuteます。非同期処理では、EFコアのカスタム IAsyncQueryProviderMicrosoft.EntityFrameworkCore.Query.Internal名前空間、 Microsoft.EntityFrameworkCore.dllアセンブリ内)と同様の別の標準インターフェイスを導入する必要があります。私はBCLチームの協力/承認が必要で、時間がかかると思うので、今はカスタムパスを取ることにしました。


人気のある回答

EF Core(現在のバージョン2.1を含むすべてのバージョン)のMicrosoftの公式ドキュメントによれば、次のようになります。

このAPIは、Entity Frameworkコアインフラストラクチャをサポートしており、コードから直接使用するためのものではありません。このAPIは将来のリリースで変更されるか、または削除される可能性があります。

ソース: https : //docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.query.internal.asynclinqoperatorprovider.toasyncenumerable?view=efcore-2.1

ps私は個人的にAutoMapperツール(少なくともバージョン6.2.2まで)との組み合わせで問題があることを発見しました - AutoMapperがシームレスに動作するIEnumerableとは異なり、タイプIAsyncEnumerableのコレクションはマップされません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ