私はFind(id)
Entity Framework 5 のコレクションで拡張メソッドを使用してきました。ただし、コレクションの代わりにオブジェクトを取得するためWhere(s => s.Id == 1)
に追加した使用例の多くは、 を使用しています。FirstOrDefault()
これはスタイルの違いですか、それとも明らかな .Where() 設定には機能的な理由がありますか?
2 に答える
Find()は、Where()、Single()、First()などと基本的な違いがあり、最初にメモリ内のオブジェクトを検索し、オブジェクトがまだロードされていない場合にのみデータベースにヒットします。したがって、メモリからロードすることで速度が向上する可能性があるため、可能な場合はFind()を使用してみてください。Find()は主キーでのみ機能し、ラムダをサポートしないため、あまり柔軟性がありません。
Where()は通常、オブジェクトのリストを取得するために使用されます。単一のオブジェクトを取得するには、通常、Single()、SingleorDefault()、First()、FirstorDefault()のいずれかを使用します。
Single()およびSingleOrDefault()は、データベース内のデータの整合性を確保するのに役立つ基準を最大1つのオブジェクトが満たすことができるという点で、First()およびFirstOrDefault()とは異なります。これらの「Single」句は、SQLクエリで「TOP2」を選択し、2つのエンティティが返された場合に例外をスローすることでこれを行います。
これらをWhere()句の最後にチェーンしないように注意してください。
だから代わりに
.Where(s => s.Id == 1).FirstOrDefault();
使用する:
.FirstOrDefault(s => s.Id == 1);
この問題を完全に調査するためにブログ投稿を作成しました:http://judeokelly.com/primer-on-selecting-data-using-entity-framework/
http://wp.secretnest.info/archives/2991によると、パフォーマンスが重要な場合、.Where(...).FirstOrDefault() は FirstOrDefault(...) よりもはるかに高速です。もちろん、List Find() は以前よりもはるかに高速になる可能性があります。
したがって、受け入れられた回答とは反対に、Where(...).FirstOrDefault()! を避けるべきではありません。