質問: `Find()`と`Single()`を使用してコンテキストからデータをクエリする場合の違いは何ですか。どちらも要求されたエンティティを返します。 Microsoftで見つけたいくつかの例は、エンティティのクエリに`Single` 、 `SingleOrDefault`バリエーションを使用しています。一部は`Find`メソッドを使用し`Find` 。 どちらか一方を使用するときに「パフォーマンス」の利点はありますか?
回答: それらは同じに見えますが、いくつかの基本的な点で非常に異なります つまり、 `Find`は、コンテキストのローカルキャッシュを`Find`することから始まります。一致が見つからない場合は、データベースにクエリを送信します。 **ドキュメントはあなたの友達です** DbSet.Findメソッド.aspx) > 指定された主キー値を持つエンティティを検索します。指定された主キー値を持つエンティティがコンテキスト内に存在する場合、ストアにリクエストを行わずにすぐに返されます。それ以外の場合は、指定された主キー値を持つエンティティのストアへの要求が行われ、このエンティティが見つかった場合は、コンテキストにアタッチされて返されます。コンテキストまたはストアにエンティティが見つからない場合は、nullが返されます。 > > Queryable.SingleOrDefaultメソッド > シーケンスの単一の特定の要素、またはそのような要素が見つからない場合はデフォルト値を返します。 > > Queryable.FirstOrDefaultメソッド > シーケンスの最初の要素を返します。要素が見つからない場合はデフォルト値を返します。 > > **もっとまあまあ** エンティティのクエリと検索 > DbSetのFindメソッドは、主キーの値を使用して、コンテキストによって追跡されるエンティティを見つけようとします。エンティティがコンテキストで見つからない場合、クエリがデータベースに送信され、そこでエンティティが検索されます。エンティティがコンテキストまたはデータベースで見つからない場合は、nullが返されます。 > > 検索は、2つの重要な点でクエリの使用とは異なります。 > > * データベースへのラウンドトリップは、指定されたキーを持つエンティティがコンテキストで見つからない場合にのみ行われます。 > * Findは、Added状態のエンティティを返します。つまり、Findは、コンテキストに追加されたが、まだデータベースに保存されていないエンティティを返します。 > **更新** > これは、エンティティが既に(遅延読み込みによって)追跡されている場合、クエリを再度実行すると、実際にFindのパフォーマンスが向上することを意味しますか? > > はい、パフォーマンスが向上します