27

私はFind(id)Entity Framework 5 のコレクションで拡張メソッドを使用してきました。ただし、コレクションの代わりにオブジェクトを取得するためWhere(s => s.Id == 1)に追加した使用例の多くは、 を使用しています。FirstOrDefault()これはスタイルの違いですか、それとも明らかな .Where() 設定には機能的な理由がありますか?

4

2 に答える 2

50

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/

于 2013-02-06T03:57:49.940 に答える
1

http://wp.secretnest.info/archives/2991によると、パフォーマンスが重要な場合、.Where(...).FirstOrDefault() は FirstOrDefault(...) よりもはるかに高速です。もちろん、List Find() は以前よりもはるかに高速になる可能性があります。

したがって、受け入れられた回答とは反対に、Where(...).FirstOrDefault()! を避けるべきではありません。

于 2015-10-15T14:41:09.407 に答える