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()
の値を取得するために同じコンテキストを使用できます多分?。
FindAsync
足場を組んだコードの多くでは、FirstOrDefaultAsyncの代わりにFindAsyncを使用できます。
SingleOrDefaultAsync
より多くのデータをフェッチし、不要な作業を行います。フィルターパーツに適合するエンティティが複数ある場合は、例外をスローします。
FirstOrDefaultAsync
フィルターパーツに適合するエンティティが複数ある場合はスローされません。