web-dev-qa-db-ja.com

FirstOrDefaultAsync()およびSingleOrDefaultAsync()とFindAsync()EFCore

EFCoreから単一の項目を取得するための3つの異なるアプローチがあります。それらはFirstOrDefaultAsync()SingleOrDefaultAsync()です(デフォルト値が返されないバージョンを含む。また、FindAsync()と、 LastOrDefaultAsync()のような同じ目的でより多く。

_     var findItem = await dbContext.TodoItems
       .FindAsync(request.Id)
       .ConfigureAwait(false);

     var firstItem = await dbContext.TodoItems
        .FirstOrDefaultAsync(i => i.Id == request.Id)
        .ConfigureAwait(false);

     var singleItem = await dbContext.TodoItems
        .SingleOrDefaultAsync(i => i.Id == request.Id)
        .ConfigureAwait(false);
_

それぞれの違いを知りたいのですが。これまでのところ私が知っているのは、条件を指定して最初にFirstOrDefaultAsync()を取得することです(複数の項目が条件を満たしていることがわかっているため、通常はこれを使用します)、一方でSingleOrDefaultAsync()は、検索できる一致が1つしかないことを知っているため、およびFindAsync()は、主キーが指定されたアイテムを取得するためです。

FirstOrDefaultAsync()SingleOrDefaultAsync()は常にデータベースにヒットすると思います(これについては不明です)。FindAsync()これはMicrosoftのドキュメントによると次のとおりです。

指定された主キー値を持つエンティティを非同期で検索します。指定された主キー値を持つエンティティーがコンテキスト内に存在する場合、ストアに要求を行わずにすぐに返されます。それ以外の場合は、指定された主キー値を持つエンティティのストアへの要求が行われ、このエンティティが見つかった場合は、コンテキストにアタッチされて返されます。コンテキストまたはストアにエンティティが見つからない場合は、nullが返されます。

したがって、私の質問は、FirstOrDefault()SingleOrDefault()、およびFindAsync()に使用される指定の条件が主キーである場合、実際の違いはありますか?

私が思うに、それらが初めて使用されるときは常にdbにヒットするということですしかし、次の呼び出しはどうですか?。そしておそらくEFCoreは、FirstOrDefault()の場合と同じように、SingleOrDefault()FindAsync()の値を取得するために同じコンテキストを使用できます多分?

9
Diego Osornio

FindAsync

足場を組んだコードの多くでは、FirstOrDefaultAsyncの代わりにFindAsyncを使用できます。

SingleOrDefaultAsync

より多くのデータをフェッチし、不要な作業を行います。フィルターパーツに適合するエンティティが複数ある場合は、例外をスローします。

FirstOrDefaultAsync

フィルターパーツに適合するエンティティが複数ある場合はスローされません。

https://docs.Microsoft.com/en-us/aspnet/core/data/ef-rp/crud?view=aspnetcore-2.2#singleordefaultasync-vs-firstordefaultasync

6
Joey Phillips