2013-06-06 5 views
21

.Find(id).Where(x = >x.Id == id)の間には、.Find().Where()/.First()よりも強く使用する必要がありますか?エンティティフレームワークFind/Where

私は.Find()がより効率的だろうと思っていますが、私が避けるべきより効率的です。.Where()/.First()

私は偽の結果を実装しやすくするためにテストでジェネリックFakeDbSetを使用していることを尋ねていますが、今のところ私はそのクラスを継承し、.Find()のカスタム実装を提供する必要があります私のコード.Where()/.First()私は余分な仕事をする必要はありません。

+1

'Where'がコレクションを返すので、' Find'と 'SingleOrDefault'を比較する方が良いでしょう。 –

+0

私は常に.Firstまたは.FirstOrDefaultを使用しますが、Trueです。 –

+3

@ JimmyBosse 1レコードのみが一致するような状況では、Singleの使用を検討するとよいでしょう。 – Kyle

答えて

31

ポイントはfindで、コンテキストのローカルキャッシュを検索して開始し、一致しない場合はdbにクエリを送信します。

whereは常にdbにクエリを送信します。

EF 4. *では、findで生成されたSQLが複雑すぎて、場合によってはパフォーマンスの問題が発生すると考えていました。だから私はいつも彼がキャッシュを使用していますので、私はfindが優れている、紙でそう

EF 5でfindによって生成されたSQLをチェックする必要がありさえEF 5でwhereを使用しています。

+9

+1。 Findはまた、式ツリーを訪れるオーバーヘッドを持たないため、データベースにヒットした場合、データベースをより速くヒットすることができます。いつも 'ExpressionVisitor'を経由します。 – vcsjones

+0

キャッシュのために間違ったデータを取得することはできませんか?つまり、Dbはバックグラウンドで更新されますか? – Zapnologica

+0

はいできます。あなたはまた、それを取得した後、または分離レベルまたは...のためにレコードを更新する際に並行性アクセスの問題を持つことができます – tschmit007

関連する問題